2012-06-08 4 views
7

4 개의 결과를 생성하는 PIG 스크립트가 있습니다. 모든 파일을 단일 파일에 저장하고 싶습니다. UNION을 사용하려고 시도하지만 UNION을 사용할 때 part-m-00000, part-m-00001, part-m-00002, part-m-00003의 4 개의 파일이 생성됩니다. 단일 파일을 얻을 수 있습니까? 여기 UNIG의 결과를 단일 파일에 저장합니다.

는 위에서 언급 한 바와 같이 내가 네 파일을 얻을 AA 폴더 안에 돼지 스크립트

A = UNION Message_1,Message_2,Message_3,Message_4 into 'AA'; 

입니다. 그 안에 모든 항목이 포함 된 단일 파일을 가져올 수 없습니까?

답변

12

돼지는 올바른 일을하고 있으며 데이터 세트를 결합합니다. 하나의 파일이 모두 Hadoop에있는 하나의 데이터 세트를 의미하는 것은 아닙니다 ... Hadoop에있는 하나의 데이터 세트는 대개 폴더입니다. 여기에서 감소를 실행할 필요가 없기 때문에, 그렇게하지 않을 것입니다.

돼지를 바보로 삼아지도를 실행하고 줄이기가 필요합니다. 나는 보통이 작업을 수행하는 방법은 다음과 같습니다 다음

set default_parallel 1 

... 
A = UNION Message_1,Message_2,Message_3,Message_4; 
B = GROUP A BY 1; -- group ALL of the records together 
C = FOREACH B GENERATE FLATTEN(A); 
... 

GROUP BY 함께 그룹의 모든 레코드, 다시 밖으로 나열 FLATTEN 폭발. (이것은 새로운으로 HDFS 밖으로 다시 작성 후 모든 텍스트을 연결하고,

$ hadoop fs -cat msg1.txt msg2.txt msg3.txt msg4.txt | hadoop fs -put - union.txt 

을 : 여기에서 주목해야 할


것은이 일을 크게 다르지되지 않는 것입니다 파일)

이것은 전혀 병렬 적이 지 않지만 모든 감속기를 통해 모든 데이터를 수집하지는 않습니다.

+3

글로벌'default_parallel'을 설정하는 대신'GROUP ... BY 1 parallel 1'을 수행 할 수도 있습니다. –

1

default_parallel 속성을 설정해 보셨습니까?

grunt> set default_parallel 1 
grunt> A = UNION Message_1,Message_2,Message_3,Message_4; 
+0

아니요. 여전히 4 개의 파일을 제공합니다. 나는 방금 말한 라인을 사용했다. grunt> set default_parallel 1 돼지 특성에 관해 더해야 할 일이 있습니까? – Uno

+0

맵 전용 작업이므로 'default_parallel'설정은 축소 단계에만 영향을주기 때문에 작동하지 않습니다. 이것이 더 큰 작업의 일부라면, 마지막 작업이 축소 작업이라는 방식으로 스크립트를 작성한 다음, 그 작업 전에'default_parallel'을'1'로 설정하면 작동 할 수 있습니다. –

관련 문제