2012-07-03 83 views
5

我使用豬生成的元組組如下:PIG:獲取所有元組進行分組的袋子

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

-> 

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

這是很簡單的工作。但我的問題是得到以下幾點:從獲得的團體,我想生成一組在該組的袋子所有元組:

a1, [b1, b2, b3] 

-> 

b1,b2 
b1,b3 
b2,b3 

,如果我能鳥巢「的foreach」這很容易,首次迭代在每個組上,然後通過它的包。

我想我誤解了這個概念,我會很感激你的解釋。

謝謝。

回答

15

它看起來像你需要袋子和自身之間的笛卡爾產品。要做到這一點,你需要使用FLATTEN(袋)兩次。

代碼:

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; 

我希望它能幫助。

乾杯

4

相關的還有來自DataFu UDF庫這個UnorderedPairs功能。它產生對在一個袋子裏的所有物品(你的情況你的分組包)

+0

勞倫斯是正確的。這個UDF完全符合你的需求,它也比使用笛卡爾產品的純豬解決方案更有效率。順便說一下,URL已經改變了:[UnorderedPairs](http://datafu.incubator.apache.org/docs/datafu/1.2.0/datafu/pig/bags/UnorderedPairs.html) – matterhayes

1

可以使用GROUP ALL豬語句來生成

A = -- Some bag 
B = -- Another bag 

groupedB = group B ALL; 
result = foreach A GENERATE 
    TOTUPLE(*), groupedB.$1; 

-- Will generate 
((a1), {(b1, b2, b3)}) 
((a2), {(b1, b2, b3)}) 
((a3), {(b1, b2, b3)}) 
...