2012-05-07 16 views
2

私は次のデータセットがある場合:PIGで最も頻繁に発生する値を取得

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

は私が最初の列の各値の第二のカラム(C2)で最も頻繁に発生する値を返したいが( c1)。だから、私は次のように見えるようにしたいと思います。なぜなら、c1 = 1の場合、値 "5"が2回発生し、値 "6"が1回だけ発生し、c1 = 2の場合、 "9"他の値は、発生:

1 5 
2 9 
3 1 

ケース出現同数(ここでは、ここでC1 = 3)の場合(C1 = 3)に等しいがあるがある場合、私があるとの問題がありますc2で発生する値の数を入力すると、最初のオカレンスが返されます。

いずれかのアイデアが役に立ちます。

答えて

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)) 

B tw、大文字の変種で爆撃されたので、参照 'グループ'を小文字で書く必要がありました。たぶん異なるバージョンのため、おそろしい。

関連する問題