Databricks中从Pandas创建Spark DataFrame遇iteritems属性错误
问题描述
原本使用以下代码将Pandas DataFrame转换为Spark DataFrame:
import pandas as pd spark.createDataFrame(pd.DataFrame({'i':[1,2,3],'j':[1,2,3]}))
但升级到Pandas 2.0.0后出现报错,即使尝试降级Pandas、更换Databricks集群运行时仍无法解决,错误信息如下:
UserWarning: createDataFrame attempted Arrow optimization because 'spark.sql.execution.arrow.pyspark.enabled' is set to true; however, failed by the reason below: 'DataFrame' object has no attribute 'iteritems' Attempting non-optimization as 'spark.sql.execution.arrow.pyspark.fallback.enabled' is set to true. warn(msg) AttributeError: 'DataFrame' object has no attribute 'iteritems'
已知Pandas 2.0.0移除了iteritems()方法,且错误触发于Spark内部函数。
解决方案
- 临时快速解决:禁用Arrow优化
直接在代码中关闭Spark的Arrow优化开关,避免触发调用iteritems()的逻辑:
spark.conf.set("spark.sql.execution.arrow.pyspark.enabled", "false") # 之后再执行转换 spark.createDataFrame(pd.DataFrame({'i':[1,2,3],'j':[1,2,3]}))
长期稳定方案:匹配Spark与Pandas兼容版本
Spark不同版本对Pandas的支持有明确对应关系:- 若使用Spark 3.3.2+或3.4.x及以上版本:可以直接使用Pandas 2.0.0+,这些Spark版本已经修复了适配Pandas 2.0的兼容问题
- 若使用Spark 3.3.0/3.3.1版本:要么升级Spark到3.3.2+,要么降级Pandas到1.x系列的最后稳定版(比如Pandas 1.5.3)
- 若使用Spark 3.2.x及更早版本:必须使用Pandas 1.x系列(如1.5.3),因为旧Spark的Arrow实现依赖
iteritems()方法
备选方案:手动转换数据结构
绕开Spark内部的Pandas处理逻辑,把Pandas DataFrame转成字典列表后再创建Spark DataFrame:
pdf = pd.DataFrame({'i':[1,2,3],'j':[1,2,3]}) spark.createDataFrame(pdf.to_dict('records'))
内容的提问来源于stack exchange,提问作者data en
相关产品推荐
相关产品推荐

