2015-08-08 88 views
2

我在我的數據目錄(路徑:/ home/admin/Desktop/data)中有50個文本文件。我的任務是壓扁(標記)文本文件中的數據並將輸出存儲在50個輸出文件中。在PIG中加載多個文件的多個輸出

以下是我提出來完成這項工作的關係:現在,當我執行這個腳本的豬,我只得到一個輸出文件50個輸入文件

--This will load all the 50 text files. 
A = Load '/home/admin/Desktop/data' Using PigStorage(','); 

--This relation will create every word as a token and will flatten the data. 
B = FOREACH A GENERATE FLATTEN(TOKENIZE($0)); 

STORE B into '/home/ameya/Desktop/PigOutput'; 

如何獲得50個不同的輸出文件,每個文件都包含與輸入文件中的數據相對應的輸出數據?

+0

感謝隊友在正確的方式添加註釋:) –

回答

1

你試過PIG MultiStorage UDF

如果您想爲單獨的50個i/p文件創建50個o/p文件,那麼最好運行您的PIG腳本50次(在一個循環中)並使用i/p文件和o/p文件作爲參數你的PIG腳本。

+0

按我的知識Multistorage UDF是分裂的輸出數據爲動態地根據用戶指定的鍵不同的目錄有用字段在輸出元組中。 但我不知道輸入文件中有什麼。所以無法定義分割數據的關鍵 –

0

Split運算符可用於根據某個表達式將關係的內容劃分爲兩個或更多個關係。基於在任一下面的兩個表達式提供的條件來完成:

  • 的元組可被分配給一個以上的關係
  • 的元組可以不被分配給任何關係
在一個目錄

多個文件,其在豬用於加載,壓平並存儲:

[[email protected] ~]# ls /pigsamples/mfilesdata/ 
file1 file2 file3 

加載上述目錄:

grunt> input_data = LOAD '/pigsamples/mfilesdata' USING PigStorage (',') AS (f1:INT, f2:INT, f3:INT); 
grunt> DUMP input_data; 
(1,2,3) 
(2,3,1) 
(3,1,2) 
(4,5,6) 
(5,6,4) 
(6,4,5) 
(7,8,9) 
(8,9,7) 
(9,7,8) 

根據您的要求格式化數據。我採用了與問題中相同的操作。

grunt> formatted_data = FOREACH input_data GENERATE FLATTEN(TOKENIZE($0)); //replace with your requirements 

使用SPLIT運算符根據條件將關係拆分爲多個關係。

grunt> 
SPLIT formatted_data 
INTO split1 IF f1 <= 3, 
split2 IF (f1 > 3 AND f1 <= 6), 
split3 IF f1 > 6;  //split based on the column which is unique within all the files 

輸出:

grunt> DUMP split1; 
(1,2,3) 
(2,3,1) 
(3,1,2) 

grunt> DUMP split2; 
(4,5,6) 
(5,6,4) 
(6,4,5) 

grunt> DUMP split3; 
(7,8,9) 
(8,9,7) 
(9,7,8)