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
相关产品推荐
相关产品推荐

