1

对于每一行数据,我想将字段 1 到 N 乘以字段 0。数据每行可能有数百个字段(或就此而言可变数量的字段),因此写出每一对是不可行的。有没有办法指定一系列字段,有点像下面的(不正确的)片段?

A = LOAD 'foo.csv' USING PigStorage(','); 
B = FOREACH A GENERATE $0*($1,..);
4

1 回答 1

0

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 调用它。

于 2012-11-02T11:04:03.253 回答