私のデータセットは次のようになります。
( A, (1,2) )
( B, (2,9) )
Pig でタプルを「平坦化」したいと思います。基本的には、内側のタプルで見つかった各値に対して各レコードを繰り返します。期待される出力は次のようになります。
( A, 1 )
( A, 2 )
( B, 2 )
( B, 9 )
タプル (1,2) と (2,9) が代わりにバッグである場合、これが可能であることはわかっています。
私のデータセットは次のようになります。
( A, (1,2) )
( B, (2,9) )
Pig でタプルを「平坦化」したいと思います。基本的には、内側のタプルで見つかった各値に対して各レコードを繰り返します。期待される出力は次のようになります。
( A, 1 )
( A, 2 )
( B, 2 )
( B, 9 )
タプル (1,2) と (2,9) が代わりにバッグである場合、これが可能であることはわかっています。
あなたの洞察力は素晴らしいです。タプルをバッグに変換することで可能です。目指したいスキーマは次のとおりです: {a: chararray,{(chararray)}} 例: (A,{(1),(2)})
問題の解決策は次のとおりです。
A = LOAD 'data.txt' AS (a:chararray,b:(b1:chararray,b2:chararray));
B = FOREACH A GENERATE a, TOBAG(b.b1,b.b2);
C = FOREACH B GENERATE a, FLATTEN($1);
魔法の部分は TOBAG オペレーターです。
DataFu の UDF TransposeTupleToBag ( http://datafu.incubator.apache.org/docs/datafu/1.1.0/datafu/pig/util/TransposeTupleToBag.html ) を使用してから、バッグをフラット化して、バッグ。