【问题标题】:Can pyspark.sql.functions.udf distribute a .py module to the worker nodes?pyspark.sql.functions.udf 可以将 .py 模块分发到工作节点吗?
【发布时间】: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


【解决方案1】:

来自 spark-submit documentation

对于 Python,您可以使用 spark-submit 的 --py-files 参数添加 .py、.zip 或 .egg 文件与您的应用程序一起分发。如果 您依赖多个 Python 文件,我们建议将它们打包成一个 .zip 或 .egg。

【讨论】:

    【解决方案2】:

    SparkContext.addPyFile("my_module.py") 会做到的。

    【讨论】:

      猜你喜欢
      • 2016-11-20
      • 2014-06-14
      • 1970-01-01
      • 2021-09-06
      • 1970-01-01
      • 2020-02-12
      • 1970-01-01
      • 2016-10-13
      • 2011-01-12
      相关资源
      最近更新 更多