使用spark.createDataFrame转换pandas DataFrame仅复制表头无数据问题
问题排查与解决方案
1 优先排查低级变量名错误
你提供的代码中,创建Spark DataFrame时赋值的变量名为sparkD,后续调用show()方法的是sparkDF,两个变量名不一致,如果是笔误写错了变量名,调用未正确赋值的空变量就会出现只有表头、没有数据的情况,修改为统一变量名即可:
# 统一变量名 sparkDF = spark.createDataFrame(pandasDF) sparkDF.show()
2 变量名无误时排查类型兼容问题
如果确认变量名正确,大概率是pandas DataFrame的列数据类型和Spark支持的类型不匹配导致数据读取失败,常见场景和解决方法:
- 排查pandas是否使用了Nullable扩展类型(如
Int64、StringDtype、BooleanDtype等),Spark 2.x版本对这类类型支持极差,可先将列转换为pandas传统基础类型再转换:
# 所有列转换为object类型后再转Spark DF,测试是否能正常读取数据 pandasDF = pandasDF.astype(object) sparkDF = spark.createDataFrame(pandasDF)
- 排查是否存在复杂类型列(如列表、字典、自定义类对象),这类类型无法直接转换为Spark DF,需要先做序列化或拆分为基础类型列。
3 排查Arrow兼容问题
如果你开启了Spark的Arrow优化配置(spark.sql.execution.arrow.enabled=true),Arrow版本与Spark、pandas版本不兼容时也会出现空数据问题,可临时关闭Arrow配置后重试:
# 关闭Arrow优化后重试转换 spark.conf.set("spark.sql.execution.arrow.enabled", "false") sparkDF = spark.createDataFrame(pandasDF)
4 确认原pandas数据有效性
执行以下代码确认原pandas DataFrame确实包含有效数据:
print(pandasDF.shape) print(pandasDF.head())
如果输出行数确实为161,即可排除原数据为空的问题。
内容的提问来源于stack exchange,提问作者needdemhelps
相关产品推荐
相关产品推荐

