2016-11-01 65 views
1

我有一個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以確保返回到豬腳本時類型正確。

回答

0

有問題的代碼沒有實例化你的元組實例,因此你不能在不存在的對象上調用該方法。

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