2016-11-01 7 views
1

일부 데이터를 수집 한 후 최소한의 방법으로 해당 데이터를 변환하려고하는 Pig UDF가 있습니다.Pig UDF Throwing 새 튜플을 생성 할 때 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 오류가 발생하므로 예외가 발생하고 있다는 것도 확실합니다.

명확하지 않은 점은 지구상에 왜 이런 일이 일어나고 있는지입니다.

돼지 문서 (돼지 0.14.0 API)에 따르면 newTuple(java.util.List c)에 관련 항목이 있어야합니다.

또한 돼지 스크립트로 돌아갈 때 형식이 올바른지 확인하기 위해 자체 스키마를 정의했습니다.

답변

0

코드가 튜플 인스턴스를 인스턴스화하지 않았기 때문에 존재하지 않는 개체에서 메서드를 호출 할 수 없습니다.

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