PySpark抛出ImportError,但模块实际存在且运行良好

时间:2017-07-11 16:45:47

标签: pyspark user-defined-functions cloudera pyspark-sql fuzzywuzzy

我正在使用Cloudera,Spark版本是2.1.0。

我试图交叉加入两个表并创建一个模糊匹配率的列(因此我需要导入fuzzywuzzy)。这是代码:

from fuzzywuzzy import fuzz
def fuzzy_ratio(x,y):
    from fuzzywuzzy import fuzz
    res = fuzz.token_set_ratio(x,y)
    return res

fuzz_udf = F.udf(fuzzy_ratio,IntegerType())  # register UDF

Master = tableA.crossJoin(tableB) \
               .withColumn('ratio',fuzz_udf(tableA['colA'],tableB['colB']))

它抛出

ImportError: No module named fuzzywuzzy

at org.apache.spark.api.python.PythonRunner$$anon$1.read(PythonRDD.scala:193)
at org.apache.spark.api.python.PythonRunner$$anon$1.<init>(PythonRDD.scala:234)
at org.apache.spark.api.python.PythonRunner.compute(PythonRDD.scala:152)
at org.apache.spark.sql.execution.python.BatchEvalPythonExec$$anonfun$doExecute$1.apply(BatchEvalPythonExec.scala:144)
at org.apache.spark.sql.execution.python.BatchEvalPythonExec$$anonfun$doExecute$1.apply(BatchEvalPythonExec.scala:87)
at org.apache.spark.rdd.RDD$$anonfun$mapPartitions$1$$anonfun$apply$23.apply(RDD.scala:796)

但是当我在交互式shell中输入它时,fuzzy.token_set_ratio可以正常工作。所以我真的不知道这里发生了什么。

有人可以帮我解决问题吗?万分感谢!

2 个答案:

答案 0 :(得分:1)

我遇到了类似的错误,我在我的spark submit命令中加入了fuzzywuzzy依赖。

首先压缩两个包文件夹。在我的情况下,文件夹位于C:\Anaconda2\Lib\site-packages\fuzzywuzzyC:\Anaconda2\Lib\site-packages\fuzzywuzzy-0.15.0.dist-info

位置

然后我将zip文件添加到spark-submit命令中 ../bin/spark-submit /path/to/mycode.py --py-files /path/to/fuzzywuzzy.zip

这可以确保所有工作节点都获得模糊的模糊依赖。

还可以选择稍后在sparkContext中将此依赖项添加为spark.sparkContext.addPyFile('/path/to/fuzzywuzzy.zip')

答案 1 :(得分:0)

这是因为在所有工作节点中都没有包rawwuzzy。一种解决方法是在所有工作节点中安装此程序包。

为了标准化此设置,它需要群集级别配置。有关详细信息,请参阅this cloudera链接。