我有一个 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 (Name: POUserFunc(udf.MyUDF)[tuple] - scope-38 Operator Key: scope-38) 时出现异常子项: []] 处为空:java.lang.NullPointerException
我的 UDF 获取数据并对其进行转换:
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 文档(Pig 0.14.0 API),我应该能够调用newTuple(java.util.List c)
相关项目。
我还定义了自己的模式,以确保在返回 pig 脚本时类型正确。