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

Spark读取多行嵌套JSON至DataFrame,如何保留原列顺序?

解决Spark读取多行嵌套JSON时保持原列顺序的问题

Spark自动推断JSON Schema时会默认对字段按字母排序,导致DataFrame列顺序与原JSON不一致。以下是无需手动定义Schema、动态推断同时保留原列顺序的解决方案:

核心思路

  1. 先读取JSON文件的第一条数据,提取原始字段顺序
  2. 用自动推断Schema的方式生成DataFrame后,按原始顺序重新排列列

完整代码实现

from pyspark.sql.functions import explode
import json
from pyspark.sql import SparkSession

# 初始化SparkSession
spark = SparkSession.builder \
.appName("Read JSON to DataFrame") \
.getOrCreate()

# 读取本地JSON文件,提取原始字段顺序(若为分布式存储需调整读取方式)
with open(FILE_PATH, 'r') as f:
    json_data = json.load(f)
# 获取data数组第一条记录的字段顺序
original_column_order = list(json_data['data'][0].keys())

# 读取JSON并推断Schema
json_df = spark.read.option("multiline", "true").json(FILE_PATH)

# 展开data数组
exploded_df = json_df.select(explode("data").alias("data"))

# 提取字段并按原始顺序重排
data_df = exploded_df.select("data.*").select(*original_column_order)
data_df.show()

分布式文件系统适配(如HDFS)

如果JSON文件存储在HDFS等分布式系统,改用RDD读取文件内容:

# 读取分布式文件系统中的JSON
json_rdd = spark.sparkContext.textFile(FILE_PATH)
json_str = ''.join(json_rdd.collect())
json_data = json.loads(json_str)
original_column_order = list(json_data['data'][0].keys())

注意事项

  • 依赖Python 3.7+版本:Python 3.7及以上的dict会保留键的插入顺序,确保能正确获取原JSON的字段顺序;若使用旧版本Python,需用collections.OrderedDict解析JSON以保留顺序。
  • 假设JSON中data数组的所有元素字段顺序一致,若存在不一致的情况,需根据实际需求调整字段顺序的提取逻辑。

内容的提问来源于stack exchange,提问作者Nam Nguyễn Văn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 05:55:02