データの行ごとに、フィールド 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 から呼び出します。