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

时间:2014-02-20 09:27:13

标签: 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 = 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 - ERROR 2018:内部错误。无法引入组合器进行优化。

这可能来自哪些想法?

1 个答案:

答案 0 :(得分: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();
}