我正在尝试编写一个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。 test方法只返回一个Hello world String。
我遇到的问题是,当我尝试调用类myTOKENIZE的方法test()时,我得到错误1070:错误1070:无法使用导入来解析myTOKENIZE.test:[,java.lang。,org。 apache.pig.builtin。,org.apache.pig.impl.builtin。]想法?
答案 0 :(得分:1)
当您的UDF扩展EvalFunc
时,我应该在课程exec()
中使用名为myTOKENIZE
的方法。
您的猪代码将如下所示:
C = FOREACH A GENERATE udf.myTOKENIZE(*);
请阅读http://pig.apache.org/docs/r0.7.0/udf.html#How+to+Write+a+Simple+Eval+Function
希望有所帮助。
答案 1 :(得分:0)
包udf中的myTOKENIZE也是吗?在这种情况下,你需要
C = FOREACH A GENERATE udf.myTOKENIZE.test();
答案 2 :(得分:0)
在花了太多时间(和咖啡)和一堆反复试验之后,我想出了我的问题。
重要提示:对于某些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
希望这证明对有类似问题的其他人有用!
答案 3 :(得分:0)
这已经很晚了,但我认为解决方案是在你的猪中使用udf时,你必须用你的包名给出类的完全限定路径。
package com.evalfunc.udf
;和力是我的班级名称
public class Power extends EvalFunc<Integer> {....}
然后在猪中使用它时首先在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);