2013-10-07 27 views
0

作爲一個例子,可以說我兩個不同的文件加載到一個豬腳本現在改變元組中字段的順序

A = LOAD 'file1' USING PigStorage('\t') AS (
    day:chararray, 
    month:chararray, 
    year:chararray, 
    message:chararray); 

B = LOAD 'file2' USING PigStorage('\t) AS (
    month:chararray, 
    day:chararray, 
    year:chararry, 
    message:chararray); 

,注意字段的順序是不同的,所以如果我將它們合併成一個文件C = UNION A, B;我得到...

(2,OCT,2013,INFO INVALID USERNAME) 
(OCT,3,2013,WARN STACK OVERFLOW) 

如果沒有其他原因,而不是讓用戶輕鬆讀取數據,我想重新排序字段,因此他們兩人遵循一個共同的格式,並具有相同的位置每個字段的記號。

(2,OCT,2013,INFO INVALID USERNAME) 
(3,OCT,2013,WARN STACK OVERFLOW) 

這在其他一些地方使用的消息,水平,主機等,這不只是日期字段也作物了,我想,讓一切「漂亮」各地。

在一些奇怪的僞代碼,我會尋找類似:

D = FOREACH B 
    REORDER (month,day,year) TO (day,month,year); 

我一直沒能找到任何人試圖做到這一點的例子,並沒有看到一個功能那會做。所以也許這是不可能的,我一個人在這裏,但如果任何人有任何想法,我會欣賞一些提示。

回答

1

一般來說,這在Pig中並不是必需的,因爲您只需按名稱引用字段而不用擔心它們在記錄中的位置。

C = UNION ONSCHEMA A, B; 

也就是說,如果你真的需要重新排序的關係,簡單FOREACH...GENERATE是你所需要的:如果你的目標是做兩個關係的UNION,您可以通過使用ONSCHEMA關鍵字做到這一點:

D = FOREACH B GENERATE day, month, year, message; 

請注意,在你的例子中,你實際上沒有處理元組,你正在處理整個記錄。如果你確實有一個元組,不過,你可以使用TOTUPLE內置的UDF來得到你需要去:

DESCRIBE E; 
E: {t: (month: chararray,day: chararray,year: chararray,message: chararray)} 

F = FOREACH E GENERATE TOTUPLE(t.day, t.month, t.year, t.message) AS t; 
DESCRIBE F; 
F: {t: (day: chararray,month: chararray,year: chararray,message: chararray)} 
+0

GENERATE正是我一直在尋找。 ONSCHEMA的工作效果更好,因爲如果我在一個文件中沒有數據,它會留下空字段。很好,謝謝!儘管我自己的教育是一個後續問題。元組是「有序的一組字段」,而字段是「一段數據」。那麼每條線怎麼不是一個元組?是不是用{}括號來形容一個包?這裏是我正在看的參考。 https://pig.apache.org/docs/r0.8.1/piglatin_ref2.html#relations – BeanBagKing

+1

是的,你是正確的,從技術上說,關係存儲爲一包元組,每個記錄都是一個元組。但是,這可能會讓一些人感到困惑,因爲您也可以將元組作爲其中一個字段。在後一種情況下,您需要使用如所示的「TOTUPLE」功能。 –