在 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 级深度的主要内容,如果未能解决你的问题,请参考以下文章

“解析列类型时出错”Redshift Spectrum

解析 JSON 时出错:输入中有多个文档(Redshift 到 Snowflake SQL)

Redshift Postgresql - 如何解析嵌套的 JSON

在 Swift 中使用 Alamofire 5.0 获取 3 级深度 JSON 值

在级联中解析 JSON

深度解析!短视频如何成为现象级产品