You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 19:07:52