2016-11-01 71 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(); 
     ... 
    } 
}