2012-06-19 2 views
1

나는 PIG 스크립트를 실행하고 있는데, 이는 모두 FOREACH ... GENERATE FLATTEN(...) 행에 도달 할 때까지 매우 빠르게 진행됩니다.PIG 라틴어 문장이 매우 느림

해당 줄이 너무 느리게 실행되어야하는 이유가 있습니까?

extended = FOREACH kRecords GENERATE *, NORMALIZE(query) AS query_norm:chararray; 
-- DESCRIBE extended; 
-- extended: {query: chararray,url: chararray,query_norm: chararray} 

-- GROUP by both query and url 
grouped = GROUP extended BY (query_norm, url); 
-- DESCRIBE grouped; 
-- grouped: {group: (query_norm: chararray,url: chararray),extended: {(query: chararray,url: chararray,query_norm: chararray)}} 

-- Remove multiple items per record (but at the expense of duplicating records) 
-- THE LINE BELOW IS THE SLOW ONE!!! 
flattened = FOREACH grouped GENERATE FLATTEN(extended.query_norm), FLATTEN(extended.url); 
-- THE LINE ABOVE IS THE SLOW ONE!!! 

-- Remove duplicates 
result = DISTINCT flattened; 

덕분에, 베리

이 평평하게 (...) 연산자를 함께 사용
+0

OK, 따라서 마지막 두 PIG 라인의 더 나은 해결책은 'result = FOREACH grouped GENERATE group.query_norm, group.url;'으로 바꾸는 것입니다. 그러나 이것은 FLATTEN이 왜 그렇게 느린 지 설명하지 못합니다! – barryred

답변

2

후 당신이 사이에 직교 제품을 얻을 GENERATE (그것은 매우 강력한 클러스터에서 시간 초과로 전체 스크립트의 원인) 2 봉지. 따라서 GROUP이 생산 한 가방에 N 개의 요소가있는 경우 동일한 가방에있는 2 개의 FLATTEN (..) 연산자를 사용하면 각 그룹마다 N * N 개의 행을 생성하므로 과도하게 CPU, HDD 및 네트워크에 과세 할 수 있습니다. 다음 예를 참조하십시오

CODE :

inpt = load '/pig_fun/input/group.txt' as (c1, c2); 
grp = group inpt by (c1, c2); 
flt = foreach grp generate FLATTEN(inpt.c1), FLATTEN(inpt.c2); 

INPUT :

1       a 
1  a 
1       b 
1       b 
1  c 

출력 :

(1,a) 
(1,a) 
(1,a) 
(1,a) 
(1,b) 
(1,b) 
(1,b) 
(1,b) 
(1,c) 

방법을 참조하십시오 (1, a)의 2 레코드와 (1, b)의 2 레코드는 각각 4 개의 출력 레코드를 발생 시켰습니다. 그러나 (1, c)의 1 레코드는 단지 1 개의 출력 레코드를 발생 시켰습니다.