2014-02-20 47 views
2

我想構建一個Pig UDF,它對double類型的變量執行一些聚合。爲此,我構建了一個名爲Aggreg的代數UDF。它被稱爲以下腳本:PIG具有參數的代數UDF:組合器優化器錯誤

REGISTER 'Test.jar'; 
DEFINE Aggreg com.pig.test.Agreg(); 
records = LOAD '/tmp/Test.csv' USING PigStorage(',') AS (v1:chararray, v2:double); 
grouped_rec = GROUP records ALL; 
test = FOREACH grouped_rec GENERATE Aggreg(records.v2) AS val; 
DUMP test; 

這工作正常。然後,我想使用這個UDF的參數,所以我添加了一個帶有一個String參數的公共構造函數。

我只是改變了DEFINE語句前面的腳本,但尚未使用的UDF的Java代碼的說法:

DEFINE Aggreg com.pig.test.Agreg('Test'); 

現在我得到以下錯誤:

ERROR org.apache.pig.tools.grunt.Grunt - ERROR 2018: Internal error. Unable to introduce the combiner for optimization.

任何想法可能來自哪裏?

回答

0

使用代數接口,您必須在類Initial,Intermed和Final中實現兩個構造函數,它們是使用參數的默認構造函數和構造函數。

static public class Initial extends EvalFunc<Tuple> { 
    public Initial(){} 
    public Initial(String str){Aggreg.string=trs;} 

    @Override 
    public Tuple exec(Tuple input) throws IOException { 
     ... 
    } 
} 

static public class Intermed extends EvalFunc<Tuple> { 
    public Intermed(){} 
    public Intermed(String str){Aggreg.string=trs;} 

    @Override 
    public Tuple exec(Tuple input) throws IOException { 
     ... 
    } 

} 

static public class Final extends EvalFunc<Tuple> { 
    public Final(){} 
    public Final(String str){Aggreg.string=trs;} 

    @Override 
    public Tuple exec(Tuple input) throws IOException { 
     ... 
    } 
} 

public String getInitial() { 
    return Initial.class.getName(); 
} 

public String getIntermed() { 
    return Intermed.class.getName(); 
} 

public String getFinal() { 
    return Final.class.getName(); 
}