2012-05-07 5 views
2

I는 다음의 데이터가 설정되어 있다면 :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.) 케이스 (C = 3)에 동일가있는 곳에 I 인 문제를 겪고 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

돼지 스키마 참조 오류로 인해 약간의 변경 사항이 있습니다. "D = GROUP C BY c1"읽어야합니다. "D = GROUP C BY group.c1"및 "GENERATE SB.c1, SB.c2"읽어야합니다 : "일반 플랫 (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, 대문자 변형에 대한 폭격으로 참조 '그룹'을 소문자로 작성해야했습니다. 어쩌면 다른 버전으로 인해, 몰라.

관련 문제