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

如何在Athena中提取JSON字段里FAILED=TRUE的记录?

问题描述

我在Athena表中存储了如下JSON数据:

{
    "VALIDATION_TYPE": "ROW_BY_ROW",
    "DATABASE": "erp",
    "TABLES": {
        "APPLICATION_STATUS_TYPE": {
            "BATCH_VALIDATION": {
                "BATCHES": [{
                    "0": {
                        "FAILED": "FALSE",
                        "FAILURE_MSG": ""
                    }
                }, {
                    "1": {
                        "FAILED": "TRUE",
                        "FAILURE_MSG": "NULL POINTER EXCEPTION"
                    }

                }]
            }
        },
        "APPLICATION": {
            "BATCH_VALIDATION": {
                "BATCHES": [{
                    "0": {
                        "FAILED": "FALSE",
                        "FAILURE_MSG": ""
                    }
                }, {
                    "1": {
                        "FAILED": "TRUE",
                        "FAILURE_MSG": "NULL POINTER EXCEPTION"
                    }
                }]
            }
        }
    }
}

需要编写Athena/Presto查询语句,提取所有FAILED=TRUE的记录,预期输出格式如下:

VALIDATION_TYPE,DATABASE,TABLE,ID,FAILED,FAILURE_MSG
----------------------------------------------------
ROW_BY_ROW,erp,APPLICATION_STATUS_TYPE,1,TRUE,NULL POINTER EXCEPTION
ROW_BY_ROW,erp,APPLICATION,1,TRUE,NULL POINTER EXCEPTION

我已尝试使用TRANSFORM、UNNEST、JSON_EXTRACT等函数,但未成功实现需求,恳请指导适用的特定函数或解决方案。

解决方案

可以通过多层扁平化嵌套结构结合map_entries()、UNNEST、json_extract_scalar()函数实现需求,具体查询语句如下:

WITH parsed_data AS (
    SELECT
        json_extract_scalar(json_column, '$.VALIDATION_TYPE') AS VALIDATION_TYPE,
        json_extract_scalar(json_column, '$.DATABASE') AS DATABASE,
        -- 将TABLES对象转为键值对数组,拆分表名与表内容
        map_entries(json_extract(json_column, '$.TABLES')) AS table_entries
    FROM your_table_name -- 替换为你的实际表名
),
table_level AS (
    SELECT
        VALIDATION_TYPE,
        DATABASE,
        entry.key AS TABLE_NAME,
        -- 提取每个表对应的BATCHES数组
        json_extract(entry.value, '$.BATCH_VALIDATION.BATCHES') AS batches_array
    FROM parsed_data
    CROSS JOIN UNNEST(table_entries) AS t(entry)
),
batch_level AS (
    SELECT
        VALIDATION_TYPE,
        DATABASE,
        TABLE_NAME,
        -- 展开BATCHES数组中的每个元素
        batch_element
    FROM table_level
    CROSS JOIN UNNEST(batches_array) AS t(batch_element)
),
id_level AS (
    SELECT
        VALIDATION_TYPE,
        DATABASE,
        TABLE_NAME,
        -- 将单个batch对象转为键值对数组,拆分ID与校验详情
        map_entries(batch_element) AS id_entries
    FROM batch_level
),
final_details AS (
    SELECT
        VALIDATION_TYPE,
        DATABASE,
        TABLE_NAME,
        id_entry.key AS ID,
        json_extract_scalar(id_entry.value, '$.FAILED') AS FAILED,
        json_extract_scalar(id_entry.value, '$.FAILURE_MSG') AS FAILURE_MSG
    FROM id_level
    CROSS JOIN UNNEST(id_entries) AS t(id_entry)
)
SELECT
    VALIDATION_TYPE,
    DATABASE,
    TABLE_NAME AS TABLE,
    ID,
    FAILED,
    FAILURE_MSG
FROM final_details
WHERE FAILED = 'TRUE';

关键函数说明

  • map_entries():将嵌套的JSON对象转换为键值对数组,解决TABLES和单个batch对象的层级拆分问题
  • UNNEST:依次展开表条目数组、BATCHES数组、ID条目数组,把多层嵌套结构转为扁平的行数据
  • json_extract_scalar():提取JSON字段中的字符串值,确保输出字段类型符合预期

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 14:30:52