在 Redshift 中解析 JSON 6 级深度
Posted
技术标签:
【中文标题】在 Redshift 中解析 JSON 6 级深度【英文标题】:Parse JSON in Redshift 6 levels deep 【发布时间】:2020-01-24 18:12:31 【问题描述】:我正在解析 Redshift 中的 JSON 字段,但值是 6 级深。 AWS 说 JSON_EXTRACT_PATH_TEXT 有 5 级限制。我短暂地尝试了一个 cte,但由于 SQL 和 JSON 对我来说是新的,所以我陷入了困境。或者,我想知道这样做的最佳位置是否在 dbt 中。如果是这样,我可以看看那个兔子洞是否不那么深。
代码:
"overall":
"WE":
"A":
"WE: one": "1",
"WE: two": "5",
"Work: three": "1"
预期结果:
WE name value
-- ---- -----
A one 1
A two 5
A three 1
【问题讨论】:
我没有 AWS 红移,所以我会向您推荐正确的方向。你能嵌套表达式吗?我不得不将 JSON_VALUE(field, '$.one.two.three.four.five.six') 更改为 JSON_VALUE(JSON_VALUE(field, '$.one.two.three.four.five') , '$.six ') 以避开 Microsoft TSQL 中的深度限制... 【参考方案1】:首先,您的输入不是有效的 JSON ...(例如:您有 4 个打开的 ,但只有三个
)。
其次,您的输入/输出对看起来您正在尝试做的不仅仅是取消嵌套。例如,您的嵌套键
"WE:one"
被解析为 "name": "one"
。
第三:给定您的预期输出,您应该在某处有一个记录数组:
"overall":
"WE":
"A": [
"WE: one": "1",
"WE: two": "5",
"Work: three": "1"
]
因此,您不会仅通过取消嵌套来解决您的问题。
话虽如此,您可以开始使用 Redshift 的 JSON 函数之一。来自Redshift docs:
JSON_EXTRACT_PATH_TEXT
返回由 JSON 字符串中的一系列路径元素引用的 key:value 对的值。
所以在你的情况下,这看起来像:
select
json_extract_path_text('"overall": "WE": "A": "WE: one": "1", "WE: two": "5", "Work: three": "1" ','overall', 'WE', 'A')
;
然后你可以参考Return elements of Redshift JSON array on separate rows来分解数组。
【讨论】:
以上是关于在 Redshift 中解析 JSON 6 级深度的主要内容,如果未能解决你的问题,请参考以下文章
解析 JSON 时出错:输入中有多个文档(Redshift 到 Snowflake SQL)
Redshift Postgresql - 如何解析嵌套的 JSON