【发布时间】:2017-07-15 11:10:12
【问题描述】:
我使用pyspark.sql.functions.udf 定义一个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 复制到所有节点的 python,但是 1)我没有对节点的管理员访问权限,以及 2)即使我请求管理员把它放在那里并且他这样做了,然后如果我需要对模块本身进行一些调整,他可能会杀了我。
【问题讨论】:
-
SparkContext.addPyFile -
SparkContext.addPyFile("module.py") ?
-
非常感谢,这有帮助。
标签: python sql apache-spark udf