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

如何通过Spark SQL移除JSON列中的子属性?

移除Spark SQL嵌套JSON列中的指定属性

根据你的需求,这里提供几种实用的解决方案,适配不同的Spark版本和JSON结构场景:

方法一:使用Spark 3.3+原生函数json_remove(最简便)

如果你的Spark版本≥3.3,可以直接用json_remove函数,指定要删除的属性路径即可,支持嵌套层级:

示例1:移除顶级属性

假设要删除JSON中的unwanted_top_field:

SELECT json_remove(your_json_column, '$.unwanted_top_field') AS cleaned_json
FROM your_table;

示例2:移除嵌套属性

如果要删除details下的unwanted_nested_field:

SELECT json_remove(your_json_column, '$.details.unwanted_nested_field') AS cleaned_json
FROM your_table;

方法二:解析为结构体后重构(适配低版本Spark)

如果你的Spark版本低于3.3,需要先把JSON解析成Spark结构体,排除不需要的字段后再转回JSON:

步骤1:定义JSON对应的结构体Schema

假设你的JSON结构如下:

{
  "id": 1,
  "details": {
    "name": "Alice",
    "age": 30,
    "unwanted_field": "delete_me"
  },
  "tags": ["a", "b"]
}

对应的Schema字符串为:

'struct<id:int, details:struct<name:string, age:int, unwanted_field:string>, tags:array<string>>'

步骤2:解析+重构+转回JSON

WITH parsed_data AS (
    -- 将JSON列解析为结构体
    SELECT from_json(your_json_column, 'struct<id:int, details:struct<name:string, age:int, unwanted_field:string>, tags:array<string>>') AS parsed_struct
    FROM your_table
),
reconstructed_data AS (
    -- 重构结构体,排除不需要的字段
    SELECT struct(
        parsed_struct.id,
        struct(parsed_struct.details.name, parsed_struct.details.age) AS details,
        parsed_struct.tags
    ) AS cleaned_struct
    FROM parsed_data
)
-- 将重构后的结构体转回JSON
SELECT to_json(cleaned_struct) AS cleaned_json
FROM reconstructed_data;

方法三:动态拼接JSON(适合结构不固定的场景)

如果JSON结构不固定,不想硬写Schema,可以用get_json_object获取需要保留的字段,再用json_object拼接成新的JSON:

示例:移除嵌套属性details.unwanted_field

WITH cleaned_details AS (
    SELECT
        your_json_column,
        -- 先清理嵌套的details部分
        json_object(
            'name', get_json_object(your_json_column, '$.details.name'),
            'age', get_json_object(your_json_column, '$.details.age')
        ) AS cleaned_details_part
    FROM your_table
)
SELECT
    -- 拼接回完整JSON
    json_object(
        'id', get_json_object(your_json_column, '$.id'),
        'details', cleaned_details_part,
        'tags', get_json_object(your_json_column, '$.tags')
    ) AS cleaned_json
FROM cleaned_details;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 14:10:26