Apache pig脚本,错误1070:Java UDF无法解析导入

我正在尝试编写一个Java UDF,其最终目标是扩展/覆盖PigStorage的加载方法,以支持多行的条目。

我的猪脚本如下:

REGISTER udf.jar; register 'userdef.py' using jython as parser; A = LOAD 'test_data' USING PigStorage() AS row:chararray; C = FOREACH A GENERATE myTOKENIZE.test(); DUMP D; 

udf.jar看起来像:

 udf/myTOKENIZE.class 

myTOKENIZE.java导入org.apache.pig。* ande扩展了EvalFunc。 测试方法只返回一个Hello world String。

我遇到的问题是,当我尝试调用类myTOKENIZE的方法test()时,我得到错误1070:错误1070:无法使用导入解析myTOKENIZE.test:[,java.lang。,org.apache.pig .builtin。,org.apache.pig.impl.builtin。]想法?

当您的UDF扩展EvalFunc ,我应该在类myTOKENIZE一个名为exec()的方法。

你的猪代码看起来如下:

 C = FOREACH A GENERATE udf.myTOKENIZE(*); 

请阅读http://pig.apache.org/docs/r0.7.0/udf.html#How+to+Write+a+Simple+Eval+Function

希望有所帮助。

包udf中的myTOKENIZE也是吗? 在那种情况下你需要

 C = FOREACH A GENERATE udf.myTOKENIZE.test(); 

在花了太多时间(和咖啡)和一堆反复试验后,我想出了我的问题。

重要说明:对于某些jar myudfs.jar,其中包含的类必须具有定义为myudfs的包。

更正后的代码如下:

 REGISTER myudfs.jar; register 'userdef.py' using jython as parser; A = LOAD 'test_data' USING PigStorage() AS row:chararray; C = FOREACH A GENERATE myudfs.myTOKENIZE(''); DUMP C; 

myTOKENIZE.java:

 package myudfs; import java.io.IOException; import org.apache.pig.EvalFunc; import org.apache.pig.data.Tuple; import org.apache.pig.impl.util.WrappedIOException; public class myTOKENIZE extends EvalFunc (String) { public String exec(Tuple input) throws IOException { if (input == null || input.size() == 0) return null; try{ String str = (String)input.get(0); return str.toUpperCase(); }catch(Exception e){ throw WrappedIOException.wrap("Caught exception processing input row ", e); } } } 

myudfs.jar的结构:

 myudfs/myTOKENIZE.class 

希望这certificate对有类似问题的其他人有用!

这是很晚但我认为解决方案是,在你的猪中使用udf时,你必须使用你的包名给出类的完全限定路径。 package com.evalfunc.udf ; 和Power是我的类名作为public class Power extends EvalFunc {....}

然后在猪中使用它时首先在pig中注册jar文件,然后使用带有完整包名的udf,如:

record = LOAD '/user/fsbappdev/maitytest/pig/pigudf/power_data' USING PigStorage(',');

pow_result = foreach record generate com.evalfunc.udf.Power(base,exponent);