2017-02-24 22 views
0

我使用pyspark.sql.functions.udf來定義一個UDF,它使用從我寫的.py模塊導入的類。pyspark.sql.functions.udf可以將.py模塊分發給工作節點嗎?

from czech_simple_stemmer import CzechSimpleStemmer #this is my class in my module 
from pyspark.sql.functions import udf 
from pyspark.sql.types import StringType 
...some code here... 

def clean_one_raw_doc(my_raw_doc): 
    ... calls something from CzechSimpleStemmer ... 

udf_clean_one_raw_doc = udf(clean_one_raw_doc, StringType()) 

當我打電話

df = spark.sql("SELECT * FROM mytable").withColumn("output_text", udf_clean_one_raw_doc("input_text")) 

我得到一個典型巨大的錯誤消息,其中可能這是相關部分:

File "/data2/hadoop/yarn/local/usercache/ja063930/appcache/application_1472572954011_132777/container_e23_1472572954011_132777_01_000003/pyspark.zip/pyspark/serializers.py", line 431, in loads 
return pickle.loads(obj, encoding=encoding) 
ImportError: No module named 'czech_simple_stemmer' 

做我的理解正確的是pyspark分配udf_clean_one_raw_doc所有在節點的python安裝中只存在czech_simple_stemmer.py工作節點(僅存在於運行spark驅動程序的邊緣節點上)?

如果是的話,有什麼辦法可以告訴pyspark分發這個模塊嗎?我想我可以手動複製czech_simple_stemmer.py到所有節點的蟒蛇,但1)我沒有管理員訪問節點,2)即使我請求管理員把它放在那裏,他這樣做,那麼萬一我需要對模塊本身進行一些調整,他可能會殺了我。

+2

'SparkContext.addPyFile' – zero323

+1

SparkContext.addPyFile(「module.py」)? –

+0

非常感謝,這有所幫助。 – jrx1301

回答

0

SparkContext.addPyFile(「my_module.py」)會這樣做。

0

從火花提交documentation

對於Python,你可以使用的--py-文件參數火花提交補充 的.py,.zip或.egg文件與分發您應用。如果 您依賴於多個Python文件,我們建議將它們打包爲 .zip或.egg。

相關問題