将 pyspark pandas_udf 与 AWS EMR 一起使用时出现“没有名为‘pandas’的模块”错误

Posted

技术标签:

【中文标题】将 pyspark pandas_udf 与 AWS EMR 一起使用时出现“没有名为‘pandas’的模块”错误【英文标题】:"No module named 'pandas' " error occurs when using pyspark pandas_udf with AWS EMR 【发布时间】:2021-05-22 10:08:53 【问题描述】:

我在 AWS EMR 上使用 zeppelin 运行了此站点 (https://spark.apache.org/docs/latest/sql-pyspark-pandas-with-arrow.html#co-grouped-map) 的代码。

%pyspark
import pandas as pd
from pyspark.sql.functions import pandas_udf, PandasUDFType
    df1 = spark.createDataFrame(
        [(20000101, 1, 1.0), (20000101, 2, 2.0), (20000102, 1, 3.0), (20000102, 2, 4.0)],
        ("time", "id", "v1"))

df2 = spark.createDataFrame(
    [(20000101, 1, "x"), (20000101, 2, "y")],
    ("time", "id", "v2"))

def asof_join(l, r):
    return pd.merge_asof(l, r, on="time", by="id")

df1.groupby("id").cogroup(df2.groupby("id")).applyInPandas(
    asof_join, schema="time int, id int, v1 double, v2 string").show()

在运行最后一行时出现“ModuleNotFoundError: No module named 'pandas'”错误。 df1.groupby("id").cogroup(df2.groupby("id")).applyInPandas( asof_join, schema="time int, id int, v1 double, v2 string").show()

> pyspark.sql.utils.PythonException:   An exception was thrown from
> Python worker in the executor. The below is the Python worker
> stacktrace. Traceback (most recent call last):   File
> "/mnt/yarn/usercache/zeppelin/appcache/application_1765329837897_0004/container_1765329837897_0004_01_000026/pyspark.zip/pyspark/worker.py",
> line 589, in main
>     func, profiler, deserializer, serializer = read_udfs(pickleSer, infile, eval_type)   File
> "/mnt/yarn/usercache/zeppelin/appcache/application_1765329837897_0004/container_1765329837897_0004_01_000026/pyspark.zip/pyspark/worker.py",
> line 434, in read_udfs
>     arg_offsets, f = read_single_udf(pickleSer, infile, eval_type, runner_conf, udf_index=0)   File
> "/mnt/yarn/usercache/zeppelin/appcache/application_1765329837897_0004/container_1765329837897_0004_01_000026/pyspark.zip/pyspark/worker.py",
> line 254, in read_single_udf
>     f, return_type = read_command(pickleSer, infile)   File "/mnt/yarn/usercache/zeppelin/appcache/application_1765329837897_0004/container_1765329837897_0004_01_000026/pyspark.zip/pyspark/worker.py",
> line 74, in read_command
>     command = serializer._read_with_length(file)   File "/mnt/yarn/usercache/zeppelin/appcache/application_1765329837897_0004/container_1765329837897_0004_01_000026/pyspark.zip/pyspark/serializers.py",
> line 172, in _read_with_length
>     return self.loads(obj)   File "/mnt/yarn/usercache/zeppelin/appcache/application_1765329837897_0004/container_1765329837897_0004_01_000026/pyspark.zip/pyspark/serializers.py",
> line 458, in loads
>     return pickle.loads(obj, encoding=encoding)   File "/mnt/yarn/usercache/zeppelin/appcache/application_1765329837897_0004/container_1765329837897_0004_01_000026/pyspark.zip/pyspark/cloudpickle.py",
> line 1110, in subimport
>     __import__(name)
> ModuleNotFoundError: No module named 'pandas'

你使用的库版本如下 “pyspark 3.0.0 火花3.0.0 pyarrow 0.15.1 齐柏林飞艇 0.9.0" 并将 zeppelin.pyspark.python 配置属性设置为 python3

由于原来的 EMR 环境中没有安装 pandas,所以我使用命令“sudo python3 -m pip install pandas”安装了它。 我已经确认,如果我在 zeppelin 上运行代码“import pandas”,它运行良好。

但是,当我使用 pyspark 中的 pandas_udf 时,我得到一个错误 pandas cannot be found。 为什么是这样?如何正确操作?

【问题讨论】:

我认为是因为它没有安装在执行器中。 感谢您的评论如果我在创建 EMR 时将“sudo python -m install pandas”添加到用于引导操作的 shell 脚本中,它会安装在所有执行程序中吗? 是的,引导操作应该没问题 是的,使用 bootstrap 在所有执行器中安装 py 依赖项。对于 python 3,它应该是 sudo python3 -m install pandas 【参考方案1】:

将“sudo python3 -m install pandas”写入 shell 脚本以进行引导操作解决此问题。

【讨论】:

以上是关于将 pyspark pandas_udf 与 AWS EMR 一起使用时出现“没有名为‘pandas’的模块”错误的主要内容,如果未能解决你的问题,请参考以下文章

pandas_udf 与 pyspark 3.0 的 scipiy.find_peaks 结果不一致

将 pandas_udf 与 spark 2.2 一起使用

如何使用具有多个源列的 pandas_udf 将多个列添加到 pyspark DF?

为啥运行 pandas_udf 时 Pyspark 失败?

如何在 pyspark.sql.functions.pandas_udf 和 pyspark.sql.functions.udf 之间进行选择?

如何在 Pyspark 中使用 @pandas_udf 返回多个数据帧?