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 に答える