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

标签 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)

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

有人可以帮我解答一下吗?一百万!

最佳答案

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

为了标准化此设置,它需要集群级别的配置。参见 this cloudera 链接了解更多详情。

关于PySpark 抛出 ImportError,但 Module 确实存在并且运行良好,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45040323/

相关文章:

apache-spark - 使用 Oozie(使用 Hue)在 YARN 上运行 Spark 应用程序的正确方法是什么?

hadoop - 由于安全模式打开,无法从 dfs 中删除文件

python - 结合多个带有不同列的pyspark数据框

python - 分解两个 PySpark 数组并保留相同位置的元素

python - 如何在 PySpark 中将字典转换为数据帧

python - 使用二进制文件保存图像文件 - pyspark

node.js - 如何使用node.js运行oracle用户定义的函数

java - H2 UDF 类路径

javascript - 我可以在 BigQuery UDF 中使用 JS BigInt 吗?

java - Docker 和 Cloudera 快速入门 : How to run own jar-file?