2012-06-08 11 views
7

Tôi có Tập lệnh PIG tạo ra bốn kết quả Tôi muốn lưu trữ tất cả chúng trong một tệp duy nhất. Tôi cố gắng sử dụng UNION, tuy nhiên khi tôi sử dụng UNION tôi nhận được bốn tệp part-m-00000, part-m-00001, part-m-00002, part-m-00003. Tôi có thể lấy một tập tin không?Lưu trữ kết quả của UNION vào PIG trong một tệp duy nhất

Đây là kịch bản PIG

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

Bên trong thư mục AA tôi nhận được 4 file như đã đề cập ở trên. Tôi không thể lấy một tệp với tất cả các mục trong đó?

Trả lời

12

Pig đang làm điều đúng ở đây và kết hợp các tập dữ liệu. Tất cả là một tệp không có nghĩa là một tập dữ liệu trong Hadoop ... một bộ dữ liệu trong Hadoop thường là một thư mục. Vì nó không cần phải chạy giảm ở đây, nó sẽ không xảy ra.

Bạn cần phải đánh lừa Pig để chạy Bản đồ và Giảm. Con đường tôi thường làm điều này là:

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

các GROUP BY nhóm tất cả các hồ sơ với nhau, và sau đó phát nổ FLATTEN liệt kê trở ra.


Một điều cần lưu ý ở đây là rằng điều này không khác nhiều so với thực hiện:

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

(điều này được concatenating tất cả các văn bản, và sau đó viết nó lại ra HDFS như một mới file)

Điều này hoàn toàn không song song, nhưng cũng không phải là đang tập trung tất cả dữ liệu của bạn thông qua một bộ giảm tốc.

+3

Bạn cũng có thể thực hiện 'GROUP ... BY 1 song song 1' thay vì đặt' default_parallel' toàn cầu. –

1

Bạn đã thử đặt thuộc tính default_allel chưa?

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

Không có nó vẫn cho tôi 4 tệp. Tôi vừa mới sử dụng dòng đã nói, grunt> đặt default_allel 1 Tôi có nên làm gì đó liên quan đến đặc tính của lợn không? – Uno

+0

Đây là một công việc chỉ có bản đồ, do đó, thiết lập 'default_parallel' sẽ không hoạt động vì nó chỉ ảnh hưởng đến pha giảm. Nếu đây là một phần của công việc lớn hơn, bạn có thể thử viết kịch bản theo cách mà công việc cuối cùng là một công việc giảm, và sau đó đặt 'default_parallel' thành' 1' trước công việc đó, sau đó nó sẽ hoạt động. –