我是猪的新手。我在猪中写了一个UDF并在我的猪脚本中使用它。但它给出了以下错误
ERROR org.apache.pig.tools.grunt.Grunt - ERROR 1070: Could not resolve UserDefined.PartsOfSpeech using imports: [, java.lang., org.apache.pig.builtin., org.apache.pig.impl.builtin.]
这是我的UDF代码
public String exec(Tuple input) throws IOException {
//my code here
}
这是我的猪脚本
REGISTER /home/bigdata/NetBeansProjects/UserDefined/dist/UserDefined.jar
a = load '/user/bigdata/json' using TextLoader() as (input:chararray);
b = foreach a GENERATE UserDefined.PartsOfSpeech(input);
在上面的代码中,UserDefined是我的包名,PartsOfSpeech是我的类名
答案 0 :(得分:0)
错误消息显示Pig无法找到UserDefined.PartsOfSpeech
。
PartsOfSpeech.java在文件顶部有什么package
声明?
如果包裹声明为package com.my.company;
,请尝试改为:
REGISTER /home/bigdata/NetBeansProjects/UserDefined/dist/UserDefined.jar
a = load '/user/bigdata/json' using TextLoader() as (input:chararray);
b = foreach a GENERATE com.my.company.PartsOfSpeech(input);
也就是说,将UserDefined.PartsOfSpeech(input)
替换为com.my.company.PartsOfSpeech(input)
,因为UDF位于包com.my.company
中。
另外,请考虑在Pig脚本中使用DEFINE
关键字,这样每次使用com.my.company
时都不需要重复PartsOfSpeech
。
DEFINE PartsOfSpeech UserDefined.dist.PartsOfSpeech();
REGISTER /home/bigdata/NetBeansProjects/UserDefined/dist/UserDefined.jar
a = load '/user/bigdata/json' using TextLoader() as (input:chararray);
b = foreach a GENERATE PartsOfSpeech(input);
Alan Gates'编程猪的第5章中有关于DEFINE
的更多信息:http://chimera.labs.oreilly.com/books/1234000001811/ch05.html#udf_define。
以下是盖茨的书中DEFINE
的一个例子:
--define.pig
register 'your_path_to_piggybank/piggybank.jar';
define reverse org.apache.pig.piggybank.evaluation.string.Reverse();
divs = load 'NYSE_dividends' as (exchange:chararray, symbol:chararray,
date:chararray, dividends:float);
backwards = foreach divs generate reverse(symbol);
答案 1 :(得分:0)
在编译UDF(java类)之前,请确保已正确提及包名称。例如,如果您提到了包名称 -
package com.pig.udf;
这意味着您还需要在linux框中处理目录。
您可以按照以下提到的步骤创建jar -
使用
创建目录mkdir -p com/pig/udf
使用包com.pig.udf
创建java类使用命令
编译java源代码javac -cp /usr/lib/pig-0.12.0.2.0.6.0-76.jar YourClass.java
然后转到您要立即创建jar的目录 -
cd ../../..
现在使用以下命令
创建jarjar -cvf yourJarName.jar com/
在脚本中使用关键字“register”注册jar,然后使用jar的路径 现在使用带有关键字com.pig.udf.YourJavaClassName的jar 为您的场景 -
REGISTER /home/bigdata/NetBeansProjects/UserDefined/dist/UserDefined.jar
a = load '/user/bigdata/json' using TextLoader() as (input:chararray);
b = foreach a GENERATE com.pig.udf.PartsOfSpeech(input);