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

如何在Athena中将Varchar类型嵌套JSON展开并提取值?

Athena中解析带转义的嵌套JSON字符串问题解决

问题背景

从Google BigQuery爬取数据暂存到Athena后,某列以字符串类型存储嵌套JSON,格式如下:

{
   "key": "Category",
   "value": {
        "string_value": "something"
   }
}

需要将JSON展开扁平化,实现类似WHERE Category = 'something'的查询,提取key和string_value字段。

尝试以下SQL时返回null:

WITH dataset AS (
  SELECT cast(json_column as json) as json_column
  from "thedatabase"
  LIMIT 10
)
SELECT
    json_extract_scalar(json_column, '$.value.string_value') AS string_value
FROM dataset

原因是将字符串转为JSON类型后,内容出现多余的转义符和外层引号,例如:

"[{\"key\":\"something\",\"value\":{\"string_value\":\"app\"}}]"

且JSON类型无法使用replace函数清理,导致解析失败。

解决方案

方法1:先清理字符串再转JSON

先通过字符串函数去掉外层引号和转义反斜杠,再转为JSON类型处理:

-- 针对外层是数组的情况
WITH dataset AS (
  SELECT 
    replace(replace(json_column, '\\', ''), '"[', '[') AS cleaned_json_str
  from "thedatabase"
  LIMIT 10
),
json_dataset AS (
  SELECT cast(replace(cleaned_json_str, ']"', ']') as json) as json_column
  FROM dataset
)
SELECT
    json_extract_scalar(json_column, '$.key') AS category_key,
    json_extract_scalar(json_column, '$.value.string_value') AS category_value
FROM json_dataset

如果JSON字符串外层是单个对象而非数组,调整清理逻辑:

WITH dataset AS (
  SELECT 
    replace(replace(json_column, '\\', ''), '"{', '{') AS cleaned_json_str
  from "thedatabase"
  LIMIT 10
),
json_dataset AS (
  SELECT cast(replace(cleaned_json_str, '}"', '}') as json) as json_column
  FROM dataset
)
SELECT
    json_extract_scalar(json_column, '$.key') AS category_key,
    json_extract_scalar(json_column, '$.value.string_value') AS category_value
FROM json_dataset

方法2:正则表达式直接提取

若JSON结构固定,可直接用正则从字符串中提取目标值,无需转JSON:

SELECT
    regexp_extract(json_column, '"key":"([^"]+)"') AS category_key,
    regexp_extract(json_column, '"string_value":"([^"]+)"') AS category_value
FROM "thedatabase"
LIMIT 10

该方法适合格式稳定的场景,规避转JSON时的转义问题。

方法3:使用json_parse函数(Athena引擎v3支持)

如果你的Athena使用引擎版本3,json_parse函数对带转义的字符串处理更友好,可直接替代cast:

WITH dataset AS (
  SELECT json_parse(json_column) as json_column
  from "thedatabase"
  LIMIT 10
)
SELECT
    json_extract_scalar(json_column, '$.key') AS category_key,
    json_extract_scalar(json_column, '$.value.string_value') AS category_value
FROM dataset

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 00:01:40