2013-03-27 122 views
3

我正在使用Pig 10.0。我想在foreach中合併包。比方說,我有以下visitors別名:Pig 10.0 - 將元組和集合包裝在一個foreach中

(a, b, {1, 2, 3, 4}), 
(a, d, {1, 3, 6}), 
(a, e, {7}), 
(z, b, {1, 2, 3}) 

我想組第一場的元組,並用一組語義合併袋得到以下下列元組:

({1, 2, 3, 4, 6, 7}, a, 6) 
({1, 2, 3}, z, 3) 

第一領域是袋子與一套語義的結合。元組的第二個字段是組字段。第三個字段是包裏的數字項目。

我想圍繞以下幾個代碼變化(更換SetUnion由集團/鮮明等),但始終沒能達到想要的行爲:

DEFINE SetUnion  datafu.pig.bags.sets.SetUnion(); 

grouped = GROUP visitors by (FirstField); 
merged = FOREACH grouped { 
    VU = SetUnion(visitors.ThirdField); 
    GENERATE 
     VU  as Vu, 
     group  as FirstField, 
     COUNT(VU) as Cnt; 
    } 
dump merged; 

你能解釋一下,我錯了,以及如何實現期望的行爲?

回答

4

我終於設法實現了想要的行爲。我的解決方案的一個自包含的例子如下:

數據文件:

a  b  1 
a  b  2 
a  b  3 
a  b  4 
a  d  1 
a  b  3 
a  b  6 
a  e  7 
z  b  1 
z  b  2 
z  b  3 

代碼:

-- Prepare data 
in = LOAD 'data' USING PigStorage() 
     AS (One:chararray, Two:chararray, Id:long); 

grp = GROUP in by (One, Two); 
cnt = FOREACH grp { 
     ids = DISTINCT in.Id; 
     GENERATE 
       ids  as Ids, 
       group.One as One, 
       group.Two as Two, 
       COUNT(ids) as Count; 
}  

-- Interesting code follows 
grp2 = GROUP cnt by One; 
cnt2 = FOREACH grp2 { 
     ids = FOREACH cnt.Ids generate FLATTEN($0); 
     GENERATE 
       ids as Ids, 
       group  as One, 
       COUNT(ids) as Count; 
}    

describe cnt2; 
dump grp2; 
dump cnt2; 

描述:

Cnt: {Ids: {(Id: long)},One: chararray,Two: chararray,Count: long} 

GRP2:

(a,{({(1),(2),(3),(4),(6)},a,b,5),({(1)},a,d,1),({(7)},a,e,1)}) 
(z,{({(1),(2),(3)},z,b,3)}) 

CNT2:

({(1),(2),(3),(4),(6),(1),(7)},a,7) 
({(1),(2),(3)},z,3) 

由於代碼使用嵌套在FOREACH一個FOREACH它需要豬> 10.0。

因爲可能存在一個更清潔的解決方案,所以我會讓這個問題在幾天內沒有解決。

0

找到了一個更簡單的解決方案。使用PigStorage()AS(col1:chararray,col2:chararray,col3:int);使用PigStorage()函數,可以使用PigStorage()函數來創建一個新的數組。

/* 但我們不需要第2欄。因此免除以避免混淆 */

relevant_input = foreach current_input生成col1,col3;

relevant_distinct = DISTINCT relevant_input;

relevant_grouped = group relevant_distinct by col1;

/* 這會給 */

(A,{(A,1),(A,2),(A,3),(A,4),(A,6)中,(a,7)})

(Z,{(z,1),(Z,2),(Z,3)})

relevant_grouped_advance =的foreach relevant_grouped生成(relevant_distinct.col3)作爲col3,group,COUNT(relevant_distinct.col3)作爲count_val;

/*這將使所需的結果*/

({(1),(2),(3),(4),(6),(7)},A,6)

({(1),(2),(3)},z,3)
相關問題