2013-03-07 79 views
0

存儲數據我目前有以下豬腳本(列的列表截斷簡潔):大和動態的分組/路徑

REGISTER /usr/lib/pig/piggybank.jar; 

inputData = LOAD '/data/$date*.{bz2,bz,gz}' USING PigStorage('\\x7F') 
PigStorage('\\x7F') 
AS (
SITE_ID_COL     :int,--      = Item Site ID 
META_ID_COL     :int,--     = Top Level (meta) category ID 
EXTRACT_DATE_COL   :chararray,--   = Date for the data points 
... 
) 

SPLIT inputData INTO site0 IF (SITE_ID_COL == 0), site3 IF (SITE_ID_COL == 3), site15 IF (SITE_ID_COL == 15); 

STORE site0 INTO 'pigsplit1/0/' USING org.apache.pig.piggybank.storage.MultiStorage('pigsplit1/0/','2', 'bz2', '\\x7F'); 
STORE site3 INTO 'pigsplit1/3/' USING org.apache.pig.piggybank.storage.MultiStorage('pigsplit1/3/','2', 'bz2', '\\x7F'); 
STORE site15 INTO 'pigsplit1/15/' USING org.apache.pig.piggybank.storage.MultiStorage('pigsplit1/15/','2', 'bz2', '\\x7F'); 

而且它是我想要它做的偉大工程,但實際上有至少22個可能的網站ID,我不確定沒有更多。我想動態創建分割並存儲到基於該列的路徑中。最簡單的方法是通過MultiStorage UDF的兩步使用,首先按站點ID分割,然後加載所有這些結果並按日期分割?這似乎效率低下。我可以通過GROUP BYs以某種方式做到這一點嗎?看起來我應該可以通過GROUP BY站點ID,然後將每行平放並運行多存儲,但我不確定如何將GROUP連接到路徑中。

回答

0

MultiStorage UDF沒有設置在兩個不同領域劃分的投入,但是這基本上是你在做什麼 - 使用SPLIT只是用兩個參數模擬MultiStorage。在這種情況下,我提出以下建議:

REGISTER /usr/lib/pig/piggybank.jar; 

inputData = LOAD '/data/$date*.{bz2,bz,gz}' USING PigStorage('\\x7F') 
AS (
SITE_ID_COL     :int,--      = Item Site ID 
META_ID_COL     :int,--     = Top Level (meta) category ID 
EXTRACT_DATE_COL   :chararray,--   = Date for the data points 
... 
) 

dataWithKey = FOREACH inputData GENERATE CONCAT(CONCAT(SITE_ID_COL, '-'), EXTRACT_DATE_COL), *; 

STORE dataWithKey INTO 'tmpDir' USING org.apache.pig.piggybank.storage.MultiStorage('tmpDir', '0', 'bz2', '\\x7F'); 

然後去了你的輸出用一個簡單的腳本來列出所有的文件在你的輸出目錄,解壓本站和日期標識,並將其移動到合適的位置無論你喜歡什麼樣的結構。

不是最優雅的解決方法,但它可以爲您工作。需要注意的一點是,您在密鑰中選擇的分隔符可能不被允許(它可能只是字母數字)。另外,你會被困在輸出數據中的額外字段。

0

我實際上已經向MultiStorage模塊提交了一個補丁,以允許在多個元組字段而不是一個字段上分割,從而生成動態輸出樹。

https://issues.apache.org/jira/browse/PIG-3258

它並沒有得到太多的關注,但我正在用它的生產沒有問題。