5

次のように、PIG を使用してタプルからグループを生成しています。

a1, b1
a1, b2
a1, b3
...

->

a1, [b1, b2, b3]
...

これは簡単で機能します。しかし、私の問題は次のものを取得することです:取得したグループから、グループのバッグにあるすべてのタプルのセットを生成したいと思います:

a1, [b1, b2, b3]

->

b1,b2
b1,b3
b2,b3

「foreach」をネストして、最初に各グループを反復処理し、次にそのバッグを反復処理できれば、これは簡単です。

私は概念を誤解していると思います。ご説明いただければ幸いです。

ありがとう。

4

3 に答える 3

15

バッグとそれ自体の間にデカルト積が必要なようです。これを行うには、FLATTEN(bag) を 2 回使用する必要があります。

コード:

inpt = load '.../group.txt' using PigStorage(',') as (id, val);
grp = group inpt by (id);
id_grp = foreach grp generate group as id, inpt.val as value_bag;
result = foreach id_grp generate id, FLATTEN(value_bag) as v1, FLATTEN(value_bag) as v2; 
dump result;

大きなバッグは多くの行を生成することに注意してください。これを回避するには、FLATTEN の前に TOP(...) を使用できます。

inpt = load '....group.txt' using PigStorage(',')  as (id, val);
grp = group inpt by (id);
id_grp = foreach grp generate group as id, inpt.val as values;
result = foreach id_grp {
    limited_bag = TOP(50, 0, values); -- all sorts of filtering could be done here
    generate id, FLATTEN(limited_bag) as v1, FLATTEN(limited_bag) as v2; 
};
dump result;

特定の出力については、FLATTEN の前にいくつかのフィルタリングを使用できます。

inpt = load '..../group.txt' as (id, val);
grp = group inpt by (id);
id_grp = foreach grp generate group as id, inpt.val as values;
result = foreach id_grp {
    l = filter values by val == 'b1' or val == 'b2';
    generate id, FLATTEN(l) as v1, FLATTEN(values) as v2; 
};
result = filter result by v1 != v2;

お役に立てば幸いです。

乾杯

于 2012-07-03T12:28:48.817 に答える
4

また、 DataFu UDF ライブラリのUnorderedPairs関数も関連しています。バッグ内のすべてのアイテムのペアを生成します(この場合、グループ化されたバッグ)

于 2013-01-24T09:02:47.827 に答える