2013-10-27 38 views
3

我有存儲在一個元組:現在如何存儲和使用可變豬

T: {long} 

{group: chararray,word_count: long} 

所以,我總結所有WORD_COUNT變量,並將其存儲在一個變量T ,我有一個變量X,看起來像:

(word1,12,word1,1) 
(word2,22,word2,4) 
(word3,32,word3,14) 

我需要做數學運算1,4,14人反對存儲在T, 價值,但我的每一個都不識別T.

result = FOREACH X GENERATE $3*T; 

失敗。它不承認T,因爲在十沒有字段稱爲T

所以,我所做的是,我越過X和T TEMP = CROSS X,T

這是正確的方式??我是新來的豬。我的解決方案似乎不是很優雅。

回答

1

不幸的是,你選擇的方式是最好的方式來做到這一點。豬沒有獨立變量的概念。你認爲是一個變量,T,實際上是一個只有一個字段的單個元組的關係。豬每次操作一條記錄,如果某條數據在該記錄中不存在,或者在內部參數(由%DEFAULT或命令行參數定義的數據)中不可用,則不能使用該記錄。

我對您的方法所做的一項修正是使用CROSS將讀取兩種關係,執行交叉積,然後將其寫回到磁盤。這是浪費資源。相反,您可以使用JOIN並利用特殊指令USING 'replicated'。這指示Pig將第二個關係存儲在內存中,並在映射階段執行連接,而不是將數據發送到reducer,完成連接並將其寫入磁盤。

temp = JOIN X BY 1, T BY 1 USING 'replicated';

由僞值1加入使JOIN相當於CROSSUSING 'replicated'T放在內存中,因此可以在地圖階段完成,因此可以與相鄰的MR作業相結合。

+0

非常感謝你!我是PIG和hadoop的初學者。你推薦的任何好書可能? – user2773013

+0

查看O'Reilly的書「編程豬」。 –