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

PySpark中如何将JSON字符串列值转为列名并合并生成目标JSON

纯PySpark实现方案

你要的需求完全可以用PySpark实现,不需要依赖原生Python。核心思路是先解析每行的JSON为键值对结构,再合并所有行的键值对生成最终的JSON对象,具体步骤如下:

步骤1:解析每行JSON为Map结构

首先把原始的JSON字符串列转换成Spark的MapType,方便提取动态的顶层键(比如AA02、AA01)和对应的嵌套结构:

from pyspark.sql import SparkSession
from pyspark.sql.functions import col, map_from_json
from pyspark.sql.types import MapType, StringType, StructType, StructField

# 初始化SparkSession
spark = SparkSession.builder.appName("MergeJsonKeys").getOrCreate()

# 模拟你的原始DataFrame(假设列名为json_str)
data = [
    ("""{"AA02": {"param": "F7VH", "value": "QP3"}}""",),
    ("""{"AA01": {"param": "F7VH", "value": "CKA"}}""",)
]
df = spark.createDataFrame(data, ["json_str"])

# 定义嵌套结构的Schema
value_schema = StructType([
    StructField("param", StringType()),
    StructField("value", StringType())
])

# 将JSON字符串转为Map<String, Struct>
df_with_map = df.withColumn("json_map", map_from_json(col("json_str"), MapType(StringType(), value_schema)))

步骤2:合并所有Map为单个JSON对象

通过拆分键值对、聚合拼接的方式,把所有行的动态键合并成一个完整的JSON:

from pyspark.sql.functions import explode, lit, collect_list, map_concat, to_json, struct

# 拆分Map为键值对行
df_exploded = df_with_map.select(explode(col("json_map")).alias("key", "value"))

# 聚合所有键值对为单个Map,再转为目标JSON字符串
result_df = df_exploded.groupBy(lit(1)) \
    .agg(
        map_concat(
            collect_list(
                map_from_json(
                    to_json(struct(col("key"), col("value"))),
                    MapType(StringType(), value_schema)
                )
            )
        ).alias("merged_map")
    ) \
    .select(to_json(col("merged_map")).alias("final_json"))

# 查看结果
result_df.show(truncate=False)

运行后会输出你需要的目标JSON:

+----------------------------------------------------------------------------------------------------+
|final_json                                                                                          |
+----------------------------------------------------------------------------------------------------+
|{"AA02":{"param":"F7VH","value":"QP3"},"AA01":{"param":"F7VH","value":"CKA"}}                       |
+----------------------------------------------------------------------------------------------------+

为什么你之前的方法不生效?

你用json_tuple直接取param和value是错误的——因为这两个字段嵌套在动态顶层键(AA02/AA01)的内部,而不是JSON根节点的字段。必须先提取动态顶层键及其对应的嵌套结构,才能进一步处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 00:53:19