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_PYTHON
和PYSPARK_PYTHON
【讨论】:
以上是关于pyspark 为自定义模块返回名为错误的无模块的主要内容,如果未能解决你的问题,请参考以下文章
查找“pyspark.worker”的模块规范时出错(ModuleNotFoundError:没有名为“pyspark”的模块)