2013-08-19 19 views
3

我想寫的Apache豬一個Python UDF裝載功能,這樣我可以在一個豬腳本以如下方式使用它:對於Apache豬,我怎麼用Python語言編寫一個負載UDF

register 'myudfs.py' using jython as myfuncs; 
A = load 'data' using myfuncs.myLoader() as line; 

Pig documentation提供了一些編寫Java的加載UDFs 的詳細信息,但未在Python中提供。我設法用Python實現了相當有用的Eval函數,但是我找不到有關如何使用這種語言編寫Load函數的任何信息。

因爲我已經在Python中實現了一些Eval UDF,所以我想堅持使用這種語言來處理所有的UDF。

+0

我剛剛發現[這個答案](http://stackoverflow.com/a/15792780/65889):根據@Ian_Stevens,Pig *的LoadFuncs不能用Python編寫。這可以解釋爲什麼文檔對此如此沉默。但是這是真的嗎? – halloleo

回答

3

是的,這是真的。你甚至可以查看源代碼來驗證。請注意0​​如何擴展EvalFunc而不是LoadFunc

如果我需要使用Python來處理加載我做的文件(S)是一樣的東西:

register 'myudfs.py' using jython as myudfs ; 

A = LOAD 'foo.bar' AS (total:chararray) ; 
B = FOREACH A GENERATE myudf.prepare_input(total) ; 

爲了模擬須藤-LoadFunc。

+0

感謝您的回答。對'JythonFunction'的引用使得它非常清晰。 – halloleo

+0

爲了解決您的問題:我嘗試完全一樣。麻煩的是,我需要對每個輸入文件的第一行進行特殊處理,並且全局行計數器列舉了所有文件中的所有行,因此在foreach中我無法知道自己是否在第一行或不。這就是爲什麼我希望寫一個真正的自定義'LoadFunc'。 – halloleo

+1

您將需要一個Java UDF。他們寫的很痛苦,但我寫了一些可能接近你想要的東西[這裏](http://stackoverflow.com/a/18345721/2336149)。枚舉可以用'RANK'完成。這與[這個問題]相同(http://stackoverflow.com/questions/18053048/with-apache-pig-how-to-select-and-store-columns-from-a-csv-according-to-頭-L)? – mr2ert