我正在尝试为Hadoop Hive编写一个UDF,它解析用户代理。以下代码在我的本地机器上工作正常,但在Hadoop上我得到:
org.apache.hadoop.hive.ql.metadata.HiveException:无法执行方法public java.lang.String MyUDF .evaluate(java.lang.String)对对象抛出org.apache.hadoop.hive.ql.metadata.HiveException MyUDF类的MyUDF @ 64ca8bfb,参数{All Occupations:java.lang.String},大小为1',
码:
import java.io.IOException;
import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.hive.ql.metadata.HiveException;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.*;
import com.decibel.uasparser.OnlineUpdater;
import com.decibel.uasparser.UASparser;
import com.decibel.uasparser.UserAgentInfo;
public class MyUDF extends UDF {
public String evaluate(String i) {
UASparser parser = null;
parser = new UASparser();
String key = "";
OnlineUpdater update = new OnlineUpdater(parser, key);
UserAgentInfo info = null;
info = parser.parse(i);
return info.getDeviceType();
}
}
我想到的事实应该提到:
public String evaluate(String i) {
return "hello" + i.toString()";
}
有什么建议?
谢谢,米哈尔
这可能是一些事情。最好的办法是检查日志,但这里列出了一些你可以在一分钟内查看的快速内容。
看看包含了什么。你应该看看来自com.decibel.uasparser
的东西。如果没有,你必须使用适当的依赖项构建jar(通常你使用maven)。
info
之后,您应该始终检查parse()
是否为null以下是如何更改它:
public class MyUDF extends UDF {
UASparser parser = new UASparser();
public MyUDF() {
super()
String key = "PUT YOUR KEY HERE";
// update only once, when the UDF is instantiated
OnlineUpdater update = new OnlineUpdater(parser, key);
}
public String evaluate(String i) {
UserAgentInfo info = parser.parse(i);
if(info!=null) return info.getDeviceType();
// you want it to return null if it's unparseable
// otherwise one bad record will stop your processing
// with an exception
else return null;
}
}
但要确切地知道,你必须查看日志......纱线日志,还可以查看你正在提交作业的机器上的hive日志(可能在/ var / log / hive中,但它取决于在你的安装上)。
这样的问题可能可以通过以下步骤解决:
UDF.getRequiredJars()
方法之上,让它返回一个hdfs
文件路径列表,其中的值由您将以下xxx_lib文件夹放入hdfs的位置确定。请注意,列表雾完全包含每个jar的完整hdfs路径字符串,例如hdfs://yourcluster/some_path/xxx_lib/some.jar
udf
代码(选择“将所需的库复制到生成的jar旁边的子文件夹中”。这些步骤将导致xxx.jar和xxx.jar旁边的lib文件夹xxx_lib试试吧。我测试这个,它的工作原理