2012-02-24 3 views
0

내가 PigLatin에 들어가기 시작 했어 나는 질문이 ... 오른쪽레코드 필터 - PigLatin

지금은 단어 계산의 고전적인 예와 함께 일하고 있어요 내가 여러 전자 책을 처리 그리고 나는 단어의 목록과 각 단어가 나타나는 횟수를 얻는다.

그 데이터를 돼지의 입력 데이터로 사용하여 각 단어가 나타나는 횟수로 정렬하고 가장 일반적인 단어 5 개를 구합니다. 지금까지는 그렇게 좋았지 만 내 문제는 5 가지 가장 일반적인 단어를 얻고 싶지만 다른 횟수로 보입니다. 내가 조금 더 설명해 보자

단어 카운트 작업이 출력 상상 :

(hey, 1) 
(hello, 10) 
(my, 2) 
(cat, 1) 
(eat, 4) 
(mom, 10) 
(house, 10) 

을 나는 다음 꿀꿀 거리는 소리 쉘에서 다음을 수행 :

data = load 'file' as (word, freq); 
srtd = order data by freq; 
lmtd = limit srtd 3; 
dump lmtd; 

내가했던 출력

(hello, 10) 
(mom, 10) 
(house, 10) 

하지만이 도착하기를 원한다면 무엇을 : 얻을 수있다

(hello, 10) 
(eat, 4) 
(my, 2) 

반복되는 주파수 값을 어떻게 필터링합니까?

감사합니다.

답변

1

MR을 현명하게 수행하기 위해 UDF를 작성할 수 있지만이 중 하나를 시도해 볼 수 있습니다. 답에 대한

 
data = load 'file' as (word, freq); 
counts = GROUP data BY freq; 
countsLimited = FOREACH counts { 
    word = TOP(1, 2, data); 
    GENERATE FLATTEN(word); 
} 

또는

 
data = load 'file' as (word, freq); 
counts = GROUP data BY freq; 
countsLimited = FOREACH counts { 
    word = LIMIT data 1; 
    GENERATE word; 
} 
+0

안녕하세요 덕분에, 두 번째 예는 작동하지만, 당신보다 조금 자세히 설명해 수없는 이유 이해가 안 돼요? 감사! – Deleteman

+0

GroupBy는 모든 단어를 Freq로 그룹화하는 데이터 세트를 생성합니다. 출력은 각각 Bag of Tuples를 포함하는 행 집합을 생성합니다. 즉 {(단어, 주파수), (단어, 주파수)}. 그런 다음 각 행의 후속 FOREACH 루프 (백). {} 또는 중첩 블록을 사용하면 각 행에 특수 프로 시저 집합을 적용 할 수 있습니다. 이는 각 행이 데이터 모음 인 즉 가방 일 때만 유용합니다. 블록 내에서 사용하는 별칭 "데이터"는 GroupBy에서 사용한 별칭에서 비롯됩니다. 우리가 작업하는 각 가방을 나타내는 것입니다. – NerdyNick