【发布时间】:2016-07-23 10:19:15
【问题描述】:
我必须在 hive 中添加以下 UDF:
package com.hadoopbook.hive;
import org.apache.commons.lang.StringUtils;
import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.io.Text;
public class Strip extends UDF {
private Text result = new Text();
public Text evaluate(Text str) {
if (str == null) {
return null;
}
result.set(StringUtils.strip(str.toString()));
return result;
}
public Text evaluate(Text str, String stripChars) {
if (str == null) {
return null;
}
result.set(StringUtils.strip(str.toString(), stripChars));
return result;
}
}
这是《Hadoop:权威指南》一书中的一个例子
-
我使用以下命令创建了上述java文件的
.class文件:hduser@nb-VPCEH35EN:~/Hadoop-tutorial/hadoop-book-master/ch17-hive/src/main/java/com/hadoopbook/hive$ javac Strip.java -
然后我使用以下命令创建了 jar 文件:
hduser@nb-VPCEH35EN:~/Hadoop-tutorial/hadoop-book-master/ch17-hive/src/main/java/com/hadoopbook/hive$ jar cvf Strip.jar Strip Strip.class Strip : no such file or directory added manifest adding: Strip.class(in = 915) (out= 457)(deflated 50%) -
我将生成的 jar 文件添加到 hdfs 目录:
hduser@nb-VPCEH35EN:~/Hadoop-tutorial/hadoop-book-master/ch17-hive/src/main/java/com/hadoopbook/hive$ hadoop dfs -copyFromLocal /home/hduser/Hadoop-tutorial/hadoop-book-master/ch17-hive/src/main/java/com/hadoopbook/hive/Strip.jar /user/hduser/input -
我尝试使用以下命令创建 UDf:
hive> create function strip as 'com.hadoopbook.hive.Strip' using jar 'hdfs://localhost/user/hduser/input/Strip.jar';
但我收到如下错误:
转换为本地 hdfs://localhost/user/hduser/input/Strip.jar 添加 [/tmp/hduser_resources/Strip.jar] 到类路径添加资源: [hdfs://localhost/user/hduser/input/Strip.jar] 注册失败 default.strip 使用类 com.hadoopbook.hive.Strip 失败:执行 错误,从 org.apache.hadoop.hive.ql.exec.FunctionTask 返回代码 1
-
我也尝试创建临时函数。 所以我首先将 jar 文件添加到配置单元中:
hive> add jar hdfs://localhost/user/hduser/input/Strip.jar; converting to local hdfs://localhost/user/hduser/input/Strip.jar Added [/tmp/hduser_resources/Strip.jar] to class path Added resources: [hdfs://localhost/user/hduser/input/Strip.jar] -
然后我尝试添加临时功能:
hive> create temporary function strip as 'com.hadoopbook.hive.Strip';
但我收到以下错误:
失败:找不到类 com.hadoopbook.hive.Strip 失败:执行 错误,从 org.apache.hadoop.hive.ql.exec.FunctionTask 返回代码 1
jar 文件已成功创建并添加到 hive。仍然显示找不到该类。 谁能告诉它有什么问题?
【问题讨论】:
-
为什么你的 jar 命令有
Strip?jar cvf Strip.jar Strip Strip.class。您可以尝试将您的 jar 构建为jar cvf Strip.jar Strip.class并重新运行吗?我使用你的 Eclipse 程序构建了 jar,它运行良好。 -
Thanks.Creating jar from eclipse 工作。但是使用 jar cvf Strip.jar Strip.class 命令构建仍然无法正常工作。这很奇怪。
-
是的 - 请参阅下面关于如何正确使用命令行创建 jar 的答案。 - 如果您的疑虑很清楚,请接受此作为答案(在下方标上正确的绿色符号)。