2016-03-14 61 views
0

假設我有一個蜂巢表(名爲表),就像這樣:部隊蜂巢表的每一行使用映射

row1 2341 
row2 828242 
row3 205252 
... 

表本身很長(千行)。我做這樣的事情來運行轉換使用Python腳本:

FROM (
MAP table.row, table.num 
USING 'python script.py' 
AS output 
FROM table 
) t1 
INSERT OVERWRITE TABLE table2 
SELECT (t1.output) as output_result; 

的問題是,因爲我確實讀了一個表,而不是文件,每一行被傳遞到相同的映射。如你所想,這需要很長時間。有沒有辦法強制每一行都去一個單獨的映射器,以便腳本中的任何邏輯都可以處理所有其他事情?基本上,我想運行它所預期的mapreduce,但只是將表中的行傳遞給不同的映射器。

感謝您的幫助。

+0

數據不應該只有一個映射器。如果是這樣,它不依賴於腳本,但數據如何存儲在表中。例如,如果數據以壓縮文本形式存儲在一個文件中,無論您做什麼,hadoop都無法將其分割爲多個映射器。 –

+0

我需要表中的每一行都轉到單獨的映射器。現在,表格只是一個文本文件。本質上,不是將文件傳遞給映射器,而是傳遞表中的行(表中有多行)。任何方式我可以強制這個? – intl

+0

我在說的是它應該已經到了多個映射器。文件有多大?壓縮(.gz)嗎? –

回答

0

輸入拆分的數量由Hadoop決定。但是您可以通過設置 mapred.min.split.size參數來控制它。

通過表格或文件傳遞行並不重要,因爲幕後都是文本文件。

默認情況下,一個千字節的文件只會被傳遞給一個映射器。 如果您只想嘗試,則可以創建大小約爲1 GB的文件,然後運行查詢。

+0

有沒有一種方法可以明確指定要使用的顯式數量以及表中行數? – intl

+0

您可以設置BLOCK SIZE(行的大小),然後一個映射器將只佔用那麼多行。 –