2011-07-08 104 views
4

道歉,如果這個問題措辭不當:我正在着手一個大型機器學習項目,我不喜歡用Java編程。我喜歡用Python編寫程序。我聽說過關於豬的好事。我想知道如果有人能夠向我闡明在數學相關的工作中Pig與Python結合的可用性。另外,如果我要寫「流式Python代碼」,Jython是否會出現?它是否更有效率?使用豬和Python

感謝

P.S:我有以下幾個原因將不喜歡使用Mahout中的代碼是。我可能想要使用他們的一些數據結構:知道這是否可行,這將是有用的。

回答

2

當您使用streaming in pig時,使用什麼語言並不重要......它所做的只是在shell中執行命令(如通過bash)。您可以使用Python,就像您可以使用grep或C程序一樣。

您現在可以定義Pig UDFs in Python natively。這些UDF在執行時將通過Jython調用。

+0

是否有這兩種方法中的任何利弊? (除了Jython和cPython之間的明顯區別,我不得不忍受...) – dvk

+0

我不認爲你會注意到使用任何顯着的放緩。 –

+0

除了速度之外,這兩種方法之間是否會有設計限制? – dvk

0

Programming Pig本書討論了使用UDF。這本書是一般不可或缺的。在最近的一個項目中,我們使用了Python UDF,偶爾也遇到了Floats vs. Doubles不匹配的問題,所以需要警告。我的印象是,對Python UDF的支持可能不如對Java UDF的支持那麼紮實,但總的來說,它工作得很好。

+0

我簡要閱讀了關於UDF的書中的一節:我對某些東西並不十分清楚:如果可以執行Python/<插入最喜歡的語言流>並嵌入所需的任何庫作爲代碼的一部分,爲什麼會使用UDF?道歉,如果這個問題有一個非常明顯的問題,但我還沒有真正考慮過流媒體。 – dvk

4

在Hadoop中使用Python的另一種選擇是PyCascading。您可以不用Python/Jython編寫UDF,也不需要使用流式處理,而是可以將整個工作放在Python中,在定義數據處理管道的同一腳本中使用Python函數作爲「UDF」。 Jython被用作Python解釋器,流操作的MapReduce框架是Cascading。這些聯結,分組等在精神上與豬的工作方式類似,所以如果你已經認識豬,那就不會有什麼驚喜了。

一個單詞統計例子是這樣的:

@map(produces=['word']) 
def split_words(tuple): 
    # This is called for each line of text 
    for word in tuple.get(1).split(): 
     yield [word] 

def main(): 
    flow = Flow() 
    input = flow.source(Hfs(TextLine(), 'input.txt')) 
    output = flow.tsv_sink('output') 

    # This is the processing pipeline 
    input | split_words | GroupBy('word') | Count() | output 

    flow.run()