Pandas DataFrame 转 Spark DataFrame报错:AttributeError_ ‘DataFrame‘ object has no attribute ‘iteritems‘

文章讲述了在升级到pandas2.0后,使用Spark时遇到的DataFrameiteritems属性缺失问题。提供了降低pandas版本、使用items替代iteritems以及升级Spark版本三种解决方法。
摘要由CSDN通过智能技术生成

环境说明

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
image.png

解决办法

方法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

image.png
具体操作如下:先卸载已安装的 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)

执行结果如下图:
image.png

方法3:升级 spark 版本

方法3:spark 和 pandas 版本的兼容问题,除了调整 pandas,当然也可以调整 spark。

spark 3.4 的发布文档看,似乎还未支持 pandas 2.0。仅支持了 pandas 1.5。
image.png

只有在 spark 3.5 版本的发布文档中,才看到支持 pandas 2.0 的信息。
image.png

所以如果要更换 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
  • 27
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Xin学数据

为你点亮一盏灯,愿你前进无阻。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值