我有一個Pig UDF,它獲取一些數據,然後嘗試以最小的方式轉換該數據。Pig UDF在生成新元組時拋出NullPointerException
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;
不過,我不斷收到以下錯誤:
ERROR 0: Exception while executing [POUserFunc (Name: POUserFUnc(udf.MyUDF)[tuple] - scope-38 Operator Key: scope-38) children: null at []]: 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 在調用tuple工廠之前確實存在。同樣很明顯,拋出異常是因爲代碼到達catch
塊,然後拋出這個NullPointerException
錯誤。
什麼是不明確的是爲什麼地球上這發生。
根據豬文檔(豬0.14.0 API),我應該能夠撥打newTuple(java.util.List c)
與相關項目。
我還定義了我自己的Schema以確保返回到豬腳本時類型正確。