Optimization 带参数的PIG代数UDF:组合器优化器错误

Optimization 带参数的PIG代数UDF:组合器优化器错误,optimization,apache-pig,Optimization,Apache Pig,我试图构建一个Pig UDF,它对double类型的变量执行一些聚合。为此,我构建了一个名为Aggreg的代数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 =

我试图构建一个Pig UDF,它对double类型的变量执行一些聚合。为此,我构建了一个名为Aggreg的代数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');
现在我得到了以下错误:

错误org.apache.pig.tools.grunt.grunt-错误2018:内部错误。无法引入组合器进行优化


有什么想法吗?

使用代数接口,必须在类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();
}
静态公共类初始扩展EvalFunc{
公共首字母(){}
公共首字母(字符串str){Aggreg.String=trs;}
@凌驾
公共元组执行(元组输入)引发IOException{
...
}
}
静态公共类Intermed扩展了EvalFunc{
公共Intermed(){}
公共中介(字符串str){Aggreg.String=trs;}
@凌驾
公共元组执行(元组输入)引发IOException{
...
}
}
静态公共类Final扩展EvalFunc{
公共最终版本(){}
公共Final(String str){Aggreg.String=trs;}
@凌驾
公共元组执行(元组输入)引发IOException{
...
}
}
公共字符串getInitial(){
返回Initial.class.getName();
}
公共字符串getIntermed(){
返回Intermed.class.getName();
}
公共字符串getFinal(){
返回Final.class.getName();
}