2013-04-15 18 views
0

我想爲一個jar文件的Hive編寫一個自定義映射器。我如何在查詢中使用它?作爲jar文件的自定義映射器

使用常規語法:

add file myfile.jar 

... 

map using myfile.jar 

似乎並沒有工作。我得到的錯誤是:

2013-04-15 22:52:26,207 INFO org.apache.hadoop.hive.ql.exec.ScriptOperator:該腳本沒有消耗所有輸入數據。這被認爲是一個錯誤。 2013-04-15 22:52:26,207 INFO org.apache.hadoop.hive.ql.exec.ScriptOperator:set hive.exec.script.allow.partial.consumption = true;忽略它。 2013年4月15日22:52:26207 FATAL ExecReducer:org.apache.hadoop.hive.ql.metadata.HiveException:java.io.IOException異常:殘破的管道

注:我的罐子是一個JRuby的文件編譯成與warbler罐子。

回答

0

Hive將執行任何映射器腳本。在這種情況下,它需要運行jar文件,如java -jar myfile.jar,但它試圖運行它作爲./myfile.jar。我的解決方案是添加名爲myfile.sh的封裝外殼腳本。 shell腳本運行該jar,並且我使用myfile.sh作爲映射器。這樣我就可以使用.jar文件作爲映射器。

0

Hive使用'流式傳輸'自定義映射器和簡化器 - 一個簡單的程序,它從stdin中讀取並在標準輸出中寫入。所以通常使用腳本語言:Python,Perl,PHP甚至Bash。和Ruby,當然。

但是,如果你想使用java程序,你應該使該程序可執行。你真的需要使用Java來進行普通的stdin/stdout工作嗎?

UPD:因此,JRuby只是使用普通的Ruby。

+0

我絕對需要使用java。相信我這不是選擇。 jRuby不是一個選項。 –

+0

無法評論你的答案,所以會在這裏回答:我認爲包裹的.sh腳本不是解決方案。 Hadoop在主節點上讀取mapper和reducer程序,並在執行之前將它們發送到每個節點。如果你使用包裝器,Hive/Hadoop將只發布該包裝器,而不是包裝器和包裝器。 –

+0

如果您使用「添加文件」知道兩者,它將分發這兩個文件。 –

0

如果您需要準確使用Java,請嘗試編寫自己的UDF代替映射器。實際上,HiveQL函數和UDF的功能與mapper一樣。