猪的Udf错误

时间:2014-07-03 09:22:10

标签: java apache-pig

我是猪的新手。我在猪中写了一个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是我的类名

2 个答案:

答案 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 ../../..

现在使用以下命令

创建jar
jar -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);
相关问题