我正在尝试构建一个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:内部错误。无法引入组合器进行优化。
这可能来自哪些想法?
答案 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();
}