2017-02-24 97 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。

相关问题