Apache pig 脚本,错误 1070:Java UDF 无法解析导入
Apache pig script, Error 1070: Java UDF could not resolve import
我正在尝试编写一个 Java UDF,其最终目标是 extending/overriding 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。测试方法只是 returns 一个 Hello world 字符串。
我遇到的问题是,当我尝试调用 class myTOKENIZE 的方法 test() 时,出现错误 1070:错误 1070:无法使用导入解析 myTOKENIZE.test:[ , java.lang., org.apache.pig.builtin., org.apache.pig.impl.builtin.] 想法?
那么myTOKENIZE在udf包里吗?在那种情况下,你需要
C = FOREACH A GENERATE udf.myTOKENIZE.test();
当你的 UDF 扩展 EvalFunc
时,我应该在 class myTOKENIZE
.
中有一个名为 exec()
的方法
您的 pig 代码将如下所示:
C = FOREACH A GENERATE udf.myTOKENIZE(*);
请阅读http://pig.apache.org/docs/r0.7.0/udf.html#How+to+Write+a+Simple+Eval+Function
希望对您有所帮助。
经过 waaaaay 太多时间(和咖啡)和一系列反复试验后,我找到了我的问题。
重要提示:对于某些 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
希望这对遇到类似问题的其他人有用!
这已经很晚了,但我认为解决方案是,在您的猪中使用 udf 时,您必须使用您的包名称提供 class 的完全限定路径。
package com.evalfunc.udf
; Power 是我的 class 名字
public class Power extends EvalFunc<Integer> {....}
然后在 pig 中使用它时,首先在 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);
我正在尝试编写一个 Java UDF,其最终目标是 extending/overriding 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。测试方法只是 returns 一个 Hello world 字符串。
我遇到的问题是,当我尝试调用 class myTOKENIZE 的方法 test() 时,出现错误 1070:错误 1070:无法使用导入解析 myTOKENIZE.test:[ , java.lang., org.apache.pig.builtin., org.apache.pig.impl.builtin.] 想法?
那么myTOKENIZE在udf包里吗?在那种情况下,你需要
C = FOREACH A GENERATE udf.myTOKENIZE.test();
当你的 UDF 扩展 EvalFunc
时,我应该在 class myTOKENIZE
.
exec()
的方法
您的 pig 代码将如下所示:
C = FOREACH A GENERATE udf.myTOKENIZE(*);
请阅读http://pig.apache.org/docs/r0.7.0/udf.html#How+to+Write+a+Simple+Eval+Function
希望对您有所帮助。
经过 waaaaay 太多时间(和咖啡)和一系列反复试验后,我找到了我的问题。
重要提示:对于某些 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
希望这对遇到类似问题的其他人有用!
这已经很晚了,但我认为解决方案是,在您的猪中使用 udf 时,您必须使用您的包名称提供 class 的完全限定路径。
package com.evalfunc.udf
; Power 是我的 class 名字
public class Power extends EvalFunc<Integer> {....}
然后在 pig 中使用它时,首先在 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);