2016-11-01 23 views
1

私はいくつかのデータを取り込み、そのデータを最小限の方法で変換しようとするPig UDFを持っています。Pig UDF Throw 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 が存在します。タプルファクトリを呼び出す前にが存在します。コードがcatchブロックに達してからこのNullPointerExceptionエラーがスローされるため、例外がスローされていることも明らかです。

明らかにされていないことは、これが地球上で起こっている理由です。

Pig docs(Pig 0.14.0 API)によれば、newTuple(java.util.List c)に関連項目を呼び出すことができます。

また、豚スクリプトに戻ったときに型が正しいことを確認するために、独自のスキーマを定義しました。

答えて

0

コードではタプルインスタンスがインスタンス化されていないため、存在しないオブジェクトに対してはメソッドを呼び出すことはできません。

public class ... { 
    TupleFactory _factory; 
    public Tuple exec(Tuple input) { 
     _factory = TupleFactory.getInstance(); 
     ... 
    } 
} 
関連する問題