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

使用PySpark从DataFrame构建嵌套JSON时子列转为字符串的问题

解决PySpark嵌套JSON被转为字符串的问题

你的问题出在对嵌套的struct额外调用了to_json——这个操作会把内部结构先序列化成字符串,外层再转JSON时自然就变成带引号的转义字符串。正确做法是直接用struct构建嵌套层级,最后统一在外层用to_json处理整个结构。

正确代码实现

from pyspark.sql.functions import *

# 示例数据
df = spark.createDataFrame(
    [('1234567','123 Main St','10SjtT','idk@gmail.com','ecom','direct')],
    ['cust_id','address','store_id','email','sales_channel','category']
)

# 构建嵌套结构,仅在外层使用to_json
dff = df.select(
    "cust_id", 
    "address",
    to_json(
        struct(
            "store_id", 
            "category", 
            "sales_channel", 
            "email",
            # 直接用struct创建嵌套对象,无需调用to_json
            struct("category", "email").alias("c_email")
        )
    ).alias("metadata")
)

# 查看结果
dff.select("metadata").show(10, False)

输出验证

执行后metadata列的JSON会符合你的期望格式:

{
    "store_id": "10SjtT",
    "category": "direct",
    "sales_channel": "ecom",
    "email": "idk@gmail.com",
    "c_email": {
        "category": "direct",
        "email": "idk@gmail.com"
    }
}

错误原因说明

你原代码中对内部的struct("category", "email")调用了to_json,这一步会把该结构转成字符串"{\"category\":\"direct\",\"email\":\"idk@gmail.com\"}"。当外层再用to_json处理时,这个字符串会被当成普通字符串值,最终输出里c_email就变成了带引号的转义字符串,而非JSON对象。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 17:33:27