ApachePig脚本,错误1070:JavaUDF无法解析导入

nfg76nw0  于 2021-05-29  发布在  Hadoop
关注(0)|答案(4)|浏览(530)

我正在尝试编写一个javaudf,其最终目标是扩展/重写pigstorage的load方法,以支持占用多行的条目。
我的Pig剧本如下:

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。测试方法只返回一个helloworld字符串。
我遇到的问题是,当我尝试调用类mytokenize的test()方法时,我得到错误1070:错误1070:无法使用导入解析mytokenize.test:[,java.lang.,org.apache.pig.builtin.,org.apache.pig.impl.builtin.]的想法?

gtlvzcf8

gtlvzcf81#

这已经很晚了,但我认为解决方法是在pig中使用udf时,必须用包名给出类的完全限定路径。 package com.evalfunc.udf ; 权力是我的学名 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);

bsxbgnwa

bsxbgnwa2#

在花了太多时间(和咖啡)和一大堆尝试和错误之后,我发现了我的问题。
重要提示:对于某些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

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

c0vxltue

c0vxltue3#

随着您的自定义项扩展 EvalFunc 应该有一个方法叫 exec() 在班上 myTOKENIZE .
您的pig代码如下所示:

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

请阅读http://pig.apache.org/docs/r0.7.0/udf.html#how+to+write+a+simple+eval+函数
希望有帮助。

i34xakig

i34xakig4#

那么mytokenize在包udf中吗?那样的话你需要

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

相关问题