pyspark为自定义模块

时间:2017-07-21 13:49:42

标签: python pyspark

我想导入包含一些模块的.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引擎拿起模块吗?

2 个答案:

答案 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'))