环境说明
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
好文推荐
发表评论