2012-05-07 52 views
2

如果我有以下數據集:檢索在PIG最頻繁出現的值

c1 c2 
--- --- 
1 5 
1 5 
1 6 
2 9 
2 9 
3 1 
3 2 

我想在第二列(C2),用於在所述第一列中的每個值返回最頻繁出現的值( C1)。所以我希望返回的數據集看起來像下面這樣,因爲對於c1 = 1,值「5」出現兩次,而值「6」只出現一次,對於c1 = 2,「9」的值出現兩次,並且不出現發生其他值:

1 5 
2 9 
3 1 

我有是問題,其中有一個等於出現次數(在此情況下,其中C1 = 3。)在情況(C1 = 3)其中,有一個相等的情況下然後我只想要返回第一個出現的值。

任何想法都會有所幫助。

回答

2

假設你有你的C1和C2上的一個:

B = GROUP A BY (c1, c2) 
C = FOREACH B GENERATE GROUP, COUNT(A) as num; 

D = GROUP C BY GROUP.c1 
E = FOREACH D { 
    SA = ORDER C BY num DESC; 
    SB = LIMIT SA 1; 
    GENERATE FLATTEN(SB.group); 
} 

應該解決您的問題。 (我在記事本中寫道,你應該檢查是否需要通過描述/說明展平)

+0

由於Pig架構參考錯誤,看起來很不錯,有一些小的變化。 「D = GROUP C BY c1」應爲:「D = GROUP C BY group.c1」和「GENERATE SB.c1,SB.c2」應爲:「GENERATE FLATTEN(SB.group)」非常感謝您的幫助。很棒! – GregH

+0

不客氣,我修正了語法 – frail

1

對於像我這樣的人來說,新語言和試圖理解上面代碼中發生了什麼,我的評論版本和轉儲輸出):

數據Samle( 'SAMPLE_DATA/test_limiting.pig'):

1|5 
1|5 
1|6 
2|9 
2|9 
3|1 
3|2 

和豬腳本本身:

A = LOAD 'sample_data/test_limiting.pig' USING PigStorage('|') AS (c1:int, c2:int); 
---- 
-- A: {c1: int,c2: int} 
---- 
-- (1,5) 
-- (1,5) 
-- (1,6) 
-- (2,9) 
-- (2,9) 
-- (3,1) 
-- (3,2) 


B = GROUP A BY (c1, c2); 
---- 
-- B: {group: (c1: int,c2: int),A: {(c1: int,c2: int)}} 
---- 
-- ((1,5),{(1,5),(1,5)}) 
-- ((1,6),{(1,6)}) 
-- ((2,9),{(2,9),(2,9)}) 
-- ((3,1),{(3,1)}) 
-- ((3,2),{(3,2)}) 


C = FOREACH B GENERATE group, COUNT(A) as num; 
---- 
-- C: {group: (c1: int,c2: int),num: long} 
---- 
-- ((1,5),2) 
-- ((1,6),1) 
-- ((2,9),2) 
-- ((3,1),1) 
-- ((3,2),1) 


D = GROUP C BY group.c1; 
---- 
-- D: {group: int,C: {(group: (c1: int,c2: int),num: long)}} 
---- 
-- (1,{((1,5),2),((1,6),1)}) 
-- (2,{((2,9),2)}) 
-- (3,{((3,1),1),((3,2),1)}) 


E = FOREACH D { 
    SA = ORDER C BY num DESC; 
    SB = LIMIT SA 1; 
    GENERATE FLATTEN(SB.group); 
} 
---- 
-- E: {null::group: (c1: int,c2: int)} 
---- 
-- ((1,5)) 
-- ((2,9)) 
-- ((3,1)) 

乙tw,我需要用小寫字母寫出參考「組」,因爲它是用大寫字母變體來轟炸的。也許由於不同的版本,不知道。