2012-05-11 33 views
2

我有一個轉換腳本(用R編寫),我想在表的子集上運行。即我想要運行許多減少步驟,對於某個列的每個值,都需要一個步驟。在表的子集上運行Hive轉換腳本

假設原始表格有{C1,C2,C3}列,變換應該在不同的C1值上運行,並將C2和C3作爲輸入數據傳遞,並將輸出與C1的值一起作爲結果。

我正在尋找Hive DISTRIBUTE操作來解決這個問題,但無法弄清楚它的正確語法/機制。

例如,如果這是我的表:

C1,C2 
a,1 
a,2 
b,1 
b,2 
b,3 

而且我的腳本爲表的每個子集返回C2的平均值,C1,那麼結果應該是:

C1,D1 
a,1.5 
b,2 

下面是語法錯誤我想要做的僞代碼。假設my_table有列C1,C2:

from my_table 
select 
    C1, 
    transform(
    C2 
) 
using 'my_script.R' 
distribute by C1 
; 

回答

1

您的腳本是一個沒有地圖組件的減少腳本。您應該使用身份映射器(/ bin/cat),然後將輸入提供給reduce部分。在地圖和減少之間是洗牌階段,這將照顧你的DISTRIBUTE BY C1條款。 下面是一些快速的,我寫的,沒有得到一個機會來驗證:

FROM (
    FROM my_table 
    MAP C1, C2 
    USING '/bin/cat' 
    AS C1, C2 
    DISTRIBUTE BY C1) map_output 
INSERT OVERWRITE TABLE mean_table 
    REDUCE map_output.C1, C2 
    USING 'my_script.R' 
AS C1, mean; 

不要忘了,它保證與鑰匙的相同值的所有記錄(C1,你的情況)去同一個reducer(即相同的腳本實例)。但是,也可以將其他記錄的輸入中的不同鍵值設置爲同一個縮減器。

例如,你可以擁有所有的 一,1 一個,2 B,1個 B,2 B,3 去同減少腳本。所以,你需要確保你打破你的減速器中的輸入記錄集

+1

謝謝馬克。我不確定這是否可以解決問題,因爲這並不意味着我的腳本只能在數據的子集上運行。我仍然需要明確處理在'a'行和'b'行上運行它。即如果我的腳本只是計算一個運行的意思,它會失敗。 – yoni

相關問題