使用Pandas API on Spark转换DataFrame时如何保留列名与嵌套结构?
问题
将基于Pandas开发的代码迁移至PySpark,采用Pandas API on Spark转换时,读取JSON生成Pandas DataFrame再转为PySpark DataFrame后,occurred数组的字段名丢失,原字典结构变成了元组和Row对象。
JSON格式示例
{ "fd": "Bank Account", "appVar": [], "varMode": "AABH", "occurred": [ { "occurredTimes": 3, "sys": [ { "varTyp": "Conf Param", "varCode": "P33" } ], "userAssignments": [] } ] }
原转换代码
import pyspark.pandas as ps import pandas as pd df_pandas = pd.read_json('./demoFile/in/all.json', orient='values') df_pyspark = ps.DataFrame(df_pandas)
结构对比
- 转换前预期
occurred结构:
[{'occurredTimes': 3, 'sys': [{'varTyp': 'Conf Param', 'varCode': 'P33'}], "userAssignments": []}]
- 转换后实际
occurred结构:
[(3, [Row(varTyp='Conf Param', varCode='P33')], [])]
解决方案
问题根源是pd.read_json的orient='values'参数,它会强制Pandas将JSON解析为无字段名的结构,后续转PySpark时自然丢失键信息。以下是两种修复方案:
方案一:修正Pandas读取逻辑
去掉orient='values'参数,让Pandas默认解析带键的JSON结构,保留嵌套字典的字段名:
import pyspark.pandas as ps import pandas as pd # 默认解析带键的JSON,保留所有字段名 df_pandas = pd.read_json('./demoFile/in/all.json') df_pyspark = ps.DataFrame(df_pandas)
方案二:直接用PySpark Pandas读取JSON(推荐)
跳过Pandas中间步骤,直接使用ps.read_json读取文件,原生支持嵌套JSON结构的解析:
import pyspark.pandas as ps # 直接读取JSON,原生保留嵌套字典结构 df_pyspark = ps.read_json('./demoFile/in/all.json')
两种方案都能让occurred字段保留原有的字典嵌套结构,不会转化为元组或Row对象。
内容的提问来源于stack exchange,提问作者codebot
相关产品推荐
相关产品推荐

