环境说明

pandas==2.0.3 spark==3.1.2

报错内容

在使用 spark 过程中,涉及将 pandas 的 DataFrame 转换为 spark 的 DataFrame,相关代码如下:

from pyspark.sql import SparkSession

import pandas as pd

if __name__ == '__main__':

# 引入SparkSession的环境

spark = SparkSession.builder.master("local").appName("pandas df to spark df").getOrCreate()

df_pd = pd.DataFrame({"id": [1], "name": ["a"]})

df_sp = spark.createDataFrame(df_pd)

print("df_sp.schema is:", df_sp.schema)

print("df_sp.show is:"), df_sp.show(truncate=False)

但是在执行代码的过程中,报错了,说 pandas 的 DataFrame 没有 iteritems 属性。 具体报错如下:

AttributeError: ‘DataFrame’ object has no attribute ‘iteritems’

错误原因

iteritems()接口在 pandas 2.0 版本已删除,使用items()替换。

版本更新记录:https://pandas.pydata.org/pandas-docs/version/2.0/whatsnew/v2.0.0.html#removal-of-prior-version-deprecations-changes

解决办法

方法1:降低 pandas 版本

在 pandas 1.5.3 版本(1.0 最新版本)中,还保留了该 API,可以改用该版本。不过使用的过程中可能一直会提示以下的红框的字体,告诉你这个要弃用了……

iteritems() API 链接:https://pandas.pydata.org/pandas-docs/version/1.5/reference/api/pandas.DataFrame.iteritems.html

具体操作如下:先卸载已安装的 2.0.3 版本,再指定下载 1.5.3 版本

pip uninstall pandas

pip install pandas==1.5.3

方法2:用 items() 替换 iteritems()

官方已经给支招了:用items()替换iteritems()。那么可以在转换之前加上一行代码,将item方法赋值给iteritems。参考代码如下:

pd.DataFrame.iteritems = pd.DataFrame.items

我使用的 PySpark 完整测试代码如下:

# -*- coding: utf-8 -*-

# @author:xindata

# Program function:pandas df to spark df

from pyspark.sql import SparkSession

import pandas as pd

if __name__ == '__main__':

# 引入SparkSession的环境

spark = SparkSession.builder.master("local").appName("pandas df to spark df").getOrCreate()

# pandas==2.0.3 已删除了 iteritems,改用 items

pd.DataFrame.iteritems = pd.DataFrame.items

df_pd = pd.DataFrame({"id": [1], "name": ["a"]})

df_sp = spark.createDataFrame(df_pd)

print("df_sp.schema is:", df_sp.schema)

print("df_sp.show is:"), df_sp.show(truncate=False)

执行结果如下图:

方法3:升级 spark 版本

方法3:spark 和 pandas 版本的兼容问题,除了调整 pandas,当然也可以调整 spark。 从 spark 3.4 的发布文档看,似乎还未支持 pandas 2.0。仅支持了 pandas 1.5。 只有在 spark 3.5 版本的发布文档中,才看到支持 pandas 2.0 的信息。 所以如果要更换 spark 版本,目前只能更换为 spark 3.5 版本。 相关issue记录:https://github.com/apache/spark/pull/40216 spark 3.5 下载链接:https://spark.apache.org/downloads.html

小结

处理方案如下,根据自身需求选择:

降低 pandas 版本:pip install pandas==1.5.3用 items() 替换 iteritems():pd.DataFrame.iteritems = pd.DataFrame.items升级 spark 版本:下载链接:https://spark.apache.org/downloads.html

好文推荐

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: