我想导入包含一些模块的.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引擎没有看到模块。知道如何确保pyspark引擎拿起模块吗?
答案 0 :(得分:5)
您必须使用设置工具构建包的egg文件,并将egg文件添加到您的应用程序中,如下所示
sc.addFile('<path of the egg file>')
此处sc
是火花上下文变量。
答案 1 :(得分:1)
很抱歉劫持该线程。我想回复@ 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'))