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

时间:2015-07-06 17:47:50

标签: java hadoop apache-pig user-defined-functions

我正在尝试编写一个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。]想法?

4 个答案:

答案 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);

相关问题