对于每一行数据,我想将字段1到N乘以字段0.数据可能每行有数百个字段(或者就此而言可变数量的字段),因此写出每对字段不是可行。有没有办法指定一系列字段,类似于以下(不正确的)代码段?
A = LOAD 'foo.csv' USING PigStorage(',');
B = FOREACH A GENERATE $0*($1,..);
答案 0 :(得分:0)
UDF可以派上用场。
实现exec(元组输入)并迭代元组的所有字段,如下所示(未测试):
public class MultiplyField extends EvalFunc<Long> {
public Long exec(Tuple input) throws IOException {
if (input == null || input.size() == 0) {
return null;
}
try {
Long retVal = 1;
for (int i = 0; i < input.size(); i++) {
Long j = (Long)input.get(i);
retVal *= j;
}
return retVal;
} catch(Exception e) {
throw WrappedIOException.wrap("Caught exception processing input row ", e);
}
}
}
然后注册您的UDF并从您的FOREACH中调用它。