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

如何将特殊键值对格式的旧JSON文件转换为PySpark DataFrame

实现代码

首先导入依赖并初始化Spark会话:

from pyspark.sql import SparkSession
from pyspark.sql.functions import map_from_entries, col, regexp_extract, from_json

# 初始化Spark会话
spark = SparkSession.builder.appName("KVJsonToDF").getOrCreate()

情况1:JSON格式标准(外层数组有对应键名)

如果你的JSON结构如下(修正了语法问题,数组键为records):

{
  "records": [
    {"key":"id","value":"1"},
    {"key":"First Name","value":"Saurabh"},
    {"key":"Email","value":"saurab4562@gmail.com"}
  ]
}

使用以下代码转换:

# 读取JSON文件
raw_df = spark.read.json("你的JSON文件路径")

# 将key-value数组转为Map结构
df_with_map = raw_df.withColumn("kv_map", map_from_entries(col("records")))

# 展开Map为独立列
result_df = df_with_map.select("kv_map.*")

# 可选:将id字段转为整数类型
result_df = result_df.withColumn("id", col("id").cast("int"))

# 查看结果
result_df.show()

情况2:JSON格式不标准(外层对象直接包数组无键名)

如果你的JSON就是提问示例里的无键名不规范格式,先按文本读取再预处理:

# 按文本格式读取文件
raw_df = spark.read.text("你的JSON文件路径")

# 提取数组部分并解析为结构化数据
parsed_df = raw_df.select(
    from_json(
        regexp_extract(col("value"), "\\{(.*)\\}", 1),
        "array<struct<key:string, value:string>>"
    ).alias("records")
)

# 后续转换逻辑和标准格式一致
df_with_map = parsed_df.withColumn("kv_map", map_from_entries(col("records")))
result_df = df_with_map.select("kv_map.*")

# 查看结果
result_df.show()

输出结果

执行后得到的DataFrame和你预期的格式一致:

+---+----------+--------------------+
| id|First Name|               Email|
+---+----------+--------------------+
|  1|   Saurabh|saurab4562gmail.com |
+---+----------+--------------------+

内容的提问来源于stack exchange,提问作者Techno_Eagle

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 04:15:03