PySpark 抛出 ImportError,但 Module 确实存在并且运行良好

Posted

技术标签:

【中文标题】PySpark 抛出 ImportError,但 Module 确实存在并且运行良好【英文标题】:PySpark throws ImportError, but Module actually exists and works well 【发布时间】:2017-07-11 16:45:46 【问题描述】:

我使用的是 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)

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

有人可以帮忙解答我的问题吗?谢谢一百万!

【问题讨论】:

【参考方案1】:

这是因为fuzzywuzzy 包并非在所有工作节点中都可用。一种解决方法是让您在所有工作节点中安装此软件包。

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

【讨论】:

@JingyingZhou 不客气-请接受答案:)【参考方案2】:

我遇到了类似的错误,我在 spark 提交命令中添加了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

这样可以确保所有工作节点都获得了fuzzywuzzy依赖。

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

【讨论】:

以上是关于PySpark 抛出 ImportError,但 Module 确实存在并且运行良好的主要内容,如果未能解决你的问题,请参考以下文章

pyspark:ImportError:没有名为 numpy 的模块

IPython Notebook 抛出 ImportError – IPython 不会

pyspark ImportError:无法导入名称累加器

Pyspark (spark 1.6.x) ImportError: 无法导入名称 Py4JJavaError

from pyspark.sql.snappy import SnappyContext - ImportError: No module named snappy

将 pyspark df 转换为 pandas 时抛出的异常是等待结果