Spark读取多行嵌套JSON至DataFrame,如何保留原列顺序?
解决Spark读取多行嵌套JSON时保持原列顺序的问题
Spark自动推断JSON Schema时会默认对字段按字母排序,导致DataFrame列顺序与原JSON不一致。以下是无需手动定义Schema、动态推断同时保留原列顺序的解决方案:
核心思路
- 先读取JSON文件的第一条数据,提取原始字段顺序
- 用自动推断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
相关产品推荐
相关产品推荐

