2012-06-08 55 views
7

我有一個可產生四個結果的PIG腳本 我想將它們全部存儲在單個文件中。 我嘗試使用UNION,但是當我使用UNION時,我得到了四個文件part-m-00000,part-m-00001,part-m-00002,part-m-00003。不能我得到一個單一的文件?在單個文件中存儲UNION在PIG中的結果

這裏是PIG腳本

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

裏面的文件夾AA,我得到4個文件,如上所述。我無法獲得包含所有條目的單個文件嗎?

回答

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爆炸,列出退了出去。


這裏有一點要注意的是,這是不是從做太大的不同:

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

(這是連接所有的文本,然後寫回出HDFS作爲一個新的文件)

這根本不是平行的,但都不是通過一個reducer彙集所有數據。

+3

您也可以執行「GROUP ... BY 1 parallel 1」而不是設置全局的「default_parallel」。 –

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',然後它就可以工作。 –