pyspark 为自定义模块返回名为错误的无模块

Posted

技术标签:

【中文标题】pyspark 为自定义模块返回名为错误的无模块【英文标题】:pyspark returns a no module named error for a custom module 【发布时间】:2017-07-21 13:49:41 【问题描述】:

我想导入一个包含一些模块的 .py 文件。我已将文件 init.py 和 util_func.py 保存在此文件夹下:

/usr/local/lib/python3.4/site-packages/myutil

util_func.py 包含我想使用的所有模块。我还需要创建一个 pyspark udf,以便我可以使用它来转换我的数据框。我的代码如下所示:

import myutil
from myutil import util_func
myudf = pyspark.sql.functions.udf(util_func.ConvString, StringType())

在代码的某个地方,我正在使用它来转换我的数据框中的一列:

df = df.withColumn("newcol", myudf(df["oldcol"]))

然后我正在尝试查看它是否将其转换为我的使用:

df.head()

它失败并出现错误“没有名为 myutil 的模块”。

我能够在 ipython 中调出函数。不知何故,pyspark engined 看不到该模块。知道如何确保 pyspark 引擎选择模块吗?

【问题讨论】:

你用的是什么python版本? myutil.py 是否存在于当前目录或环境中或环境中的包中? 它位于 /usr/local/lib/python3.4/site-packages/ 下。我也在使用 python 3.4 【参考方案1】:

您必须使用设置工具为您的包构建一个 egg 文件,并将该 egg 文件添加到您的应用程序中,如下所示

sc.addFile('<path of the egg file>') 

这里sc 是火花上下文变量。

【讨论】:

我使用了 sc.addpyfile 而不是 addfile。我不必将包添加到设置工具中。导入模块后,我用 addpyfile 初始化了 sc,然后它就可以使用这些模块了。感谢您的回复。【参考方案2】:

很抱歉劫持了线程。我想回复@rouge-one 的评论,但我没有足够的声誉来做这件事

我在使用 OP 时遇到了同样的问题,但这次模块不是单个 py 文件,而是 Python https://github.com/spotify/annoy/tree/master/annoy 中恼人的 spotify 包

我尝试了sc.addPyFile('venv.zip') 并在 spark-submit 文件中添加了--archives ./venv.zip#PYTHON \ 但它仍然抛出了同样的错误信息

我仍然可以在 spark 提交文件中使用from annoy import AnnoyIndex,但每次我尝试像这样在 udf 中导入它

    schema = ArrayType(StructType([
        StructField("char", IntegerType(), False),
        StructField("count", IntegerType(), False)
    ]))

    f= 128

    def return_candidate(x):
      from annoy import AnnoyIndex
      from pyspark import SparkFiles
      annoy = AnnoyIndex(f)
      annoy.load(SparkFiles.get("annoy.ann"))
      neighbor = 5
      annoy_object = annoy.get_nns_by_item(x,n = neighbor, include_distances=True)
      return annoy_object


    return_candidate_udf = udf(lambda y: return_candidate(y), schema )
inter4 =inter3.select('*',return_candidate_udf('annoy_id').alias('annoy_candidate_list'))

【讨论】:

【参考方案3】:

我找到了重点!当你遇到像你这样的问题时,Spark UDF 使用另一个执行器,环境变量不同!

我的情况是,我在 Zeppelin 上进行开发、调试和测试,它有两个不同的 Python 和 Spark 解释器!当我在终端中安装库时,我可以正常使用这些功能,但在 UDF 上不行!

解决方案:只需为驱动程序和执行程序设置相同的环境,PYSPARK_DRIVER_PYTHONPYSPARK_PYTHON

【讨论】:

以上是关于pyspark 为自定义模块返回名为错误的无模块的主要内容,如果未能解决你的问题,请参考以下文章

Pyspark 安装错误:没有名为“pyspark”的模块

查找“pyspark.worker”的模块规范时出错(ModuleNotFoundError:没有名为“pyspark”的模块)

自定义模块中的函数在 PySpark 中不起作用,但在交互模式下输入时它们起作用

将 PySpark 命令转换为自定义函数

加载自定义模板标签时出现问题(错误:没有名为 x 的模块)

将 pyspark pandas_udf 与 AWS EMR 一起使用时出现“没有名为‘pandas’的模块”错误