pig udf在生成新元组时抛出nullpointerexception

drkbr07n  于 2021-06-21  发布在  Pig
关注(0)|答案(1)|浏览(304)

我有一个pig udf,它接收一些数据,然后尝试以最小的方式转换这些数据。

my_data = LOAD 'path/to/data' USING SomeCustomLoader();
my_other_data = FOREACH my_data GENERATE MyUDF(COL_1, COL_2, $param1, $param2) as output;
my_final_data = FOREACH my_other_data GENERATE output.NEW_COL1, output.NEW_COL2, output.NEW_COL3;

但是,我不断得到以下错误:
错误0:执行[pouserfunc(名称:pouserfunc(udf.myudf)[tuple]-scope-38运算符键:scope-38)子级时出现异常:null at[]]:java.lang.nullpointerexception
我的自定义项获取数据并进行转换:

public class MyUDF extends EvalFunc<Tuple> {
    public Tuple exec(Tuple input) throws IOException {
        if (input == null || input.size() == 0)
            return null;

        TupleFactory _factory;

        Long fieldOne;
        String fieldTwo;
        String fieldThree;

        _factory.getInstance();

        try {
            fieldOne = Long.valueOf(input.get(0).toString());
            fieldTwo = input.get(1).toString();
            fieldThree = input.get(2).toString();

            fieldOne = doSomething(fieldOne);
            fieldTwo = doSomething(fieldTwo);
            fieldThree = doSomething(fieldThree);

            return _factory.newTuple(Arrays.asList(fieldOne, fieldTwo, fieldThree));

        } catch (Exception ex) {
            return _factory.newTuple(Arrays.asList("ParseException", "", "", ""));
        }
    }
}

在调用元组工厂之前,我已经调试并确认fieldone、fieldtwo和fieldthree确实存在。很明显,抛出异常是因为代码到达 catch 阻止然后扔这个 NullPointerException 错误。
目前尚不清楚的是,究竟为什么会发生这种情况。
根据pig文档(pig0.14.0api),我应该能够调用 newTuple(java.util.List c) 与相关项目。
我还定义了自己的模式,以确保返回pig脚本时类型是正确的。

7lrncoxx

7lrncoxx1#

有问题的代码没有示例化元组示例,因此不能对不存在的对象调用该方法。

public class ... {
    TupleFactory _factory;
    public Tuple exec(Tuple input) {
        _factory = TupleFactory.getInstance();
        ...
    }
}

相关问题