2015-06-23 41 views
0

我在運行pyspark(來自ipython-notebook)時遇到了庫錯誤,我想在我的RDD的.mapValues操作中使用Statistics.chiSqTest(obs)pyspark.mllib.stat, ,list(int))對。Spark(pyspark)在工作節點上調用統計方法時遇到困難

的主節點,如果我收集RDD作爲地圖,並逐一查看這些值,像這樣我沒有問題

keys_to_bucketed = vectors.collectAsMap() 
keys_to_chi = {key:Statistics.chiSqTest(value).pValue for key,value in keys_to_bucketed.iteritems()} 

但如果我直接做同樣的RDD我打的問題

keys_to_chi = vectors.mapValues(lambda vector: Statistics.chiSqTest(vector)) 
keys_to_chi.collectAsMap() 

導致以下異常

Traceback (most recent call last): 
    File "<ipython-input-80-c2f7ee546f93>", line 3, in chi_sq 
    File "/Users/atbrew/Development/Spark/spark-1.4.0-bin-hadoop2.6/python/lib/pyspark.zip/pyspark/mllib/stat/_statistics.py", line 238, in chiSqTest 
    jmodel = callMLlibFunc("chiSqTest", _convert_to_vector(observed), expected) 
    File "/Users/atbrew/Development/Spark/spark-1.4.0-bin-hadoop2.6/python/lib/pyspark.zip/pyspark/mllib/common.py", line 127, in callMLlibFunc 
api = getattr(sc._jvm.PythonMLLibAPI(), name) 
AttributeError: 'NoneType' object has no attribute '_jvm' 

我在火星早期有一個問題,我nstall沒有看到numpy,mac-osx有兩個python安裝(一個來自brew和一個來自操作系統),但我認爲我已經解決了這個問題。奇怪的是,這是一個附帶spark安裝的python庫(我之前的問題是使用numpy)。

  1. 安裝詳細
    • 最大OSX約塞米蒂
    • 火花的火花1.4.0彬hadoop2.6
    • 蟒經由spark-env.sh指定爲
    • PYSPARK_PYTHON=/usr/bin/python
    • PYTHONPATH=/usr/local/lib/python2.7/site-packages:$PYTHONPATH:$EA_HOME/omnicat/src/main/python:$SPARK_HOME/python/
    • 別名ipython-spark-notebook =「IPYTHON_OPTS = \」notebook \「pyspark」
    • PYSPARK_SUBMIT_ARGS = ' - NUM-執行人2 --executor-4G內存--executor-芯2'
    • 聲明-x PYSPARK_DRIVER_PYTHON = 「IPython的」
+0

經過多少次挖掘,我發現當拋出異常時,這是基本'sc'(spark context)是'None'。這是否意味着pyspark中的工作節點無法訪問'sc'變量? –

回答

1

正如你已經注意到了在您的評論中,工作節點上的sc是None。 SparkContext僅在驅動程序節點上定義。

+0

這是否意味着這種情況?這似乎是統計類的一個實際限制,不能將這個計算分配給工作節點(特別是對於向量中的卡方卡方,更重要的是因爲我想分配這個計算;))。這只是pyspark的限制,或者如果我在scala中實現,是否會面臨同樣的問題? –

+0

這是SparkContext的故意。一般來說,大部分stastics函數都是用於RDD的,在這種情況下,它們只能在驅動程序中調用(如果我們查看代碼中的doctests,我們可以看到它僅在rdds上進行測試)。由於執行程序的設置方式不同,調用java函數並不容易。我不確定這段代碼是否可以從執行者內部調用,或者只能從驅動程序調用,你可以提出一個問題讓它可以在執行器上調用,但我不確定將涉及多少工作設置py4j橋。 – Holden

+0

謝謝,我現在看到。我會根據您的建議提交請求並查看返回的內容。我看到了在RDD上應用函數的用例,它並不是我需要的。雖然使用scipy [scipy.stats.chisquare.html](http://docs.scipy.org/doc/scipy-0.15.1/reference/generated/scipy.stats.chisquare)可能更有意義。html)內部的工人。 –