对于每一行数据,我想将字段 1 到 N 乘以字段 0。数据每行可能有数百个字段(或就此而言可变数量的字段),因此写出每一对是不可行的。有没有办法指定一系列字段,有点像下面的(不正确的)片段?
A = LOAD 'foo.csv' USING PigStorage(',');
B = FOREACH A GENERATE $0*($1,..);
对于每一行数据,我想将字段 1 到 N 乘以字段 0。数据每行可能有数百个字段(或就此而言可变数量的字段),因此写出每一对是不可行的。有没有办法指定一系列字段,有点像下面的(不正确的)片段?
A = LOAD 'foo.csv' USING PigStorage(',');
B = FOREACH A GENERATE $0*($1,..);
UDF可以在这里派上用场。
实现 exec(Tuple input) 并迭代元组的所有字段,如下所示(未测试):
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 调用它。