【问题标题】:How to extract all elements in a JSON array using Redshift?如何使用 Redshift 提取 JSON 数组中的所有元素?
【发布时间】:2019-09-06 10:13:54
【问题描述】:

我想从一个嵌套了更多 JSON 的 JSON 中提取所有标题为“title2”的元素。我有在 MySQL 上运行的代码,但我无法将其转换为 Redshift。

JSON 结构: {"master-title": [{"title": "a", "title2": "b"},{"title": "c", "title2: "d", "title3": "e"}], "master-title2": [{"title": "f", "title2": "g", "title3": "h"},{"title": "i", "title2": "j", "title3": "k"}]}

MySQL 查询(按需要工作):

select id
,json_extract(myJSON, '$**.title2')),0)
from myTable

MySQL 输出: ["b", "d","g","j"]

我的问题是,在 Redshift 上,我只能将路径具体定义为: JSON_EXTRACT_PATH_TEXT(myJSON, 'master-title2',0,'title') 所以我只能得到一个元素而不是全部。

知道如何使用 Redshift 评估所有路径并获取 JSON 数组中具有相同“title2”的所有元素吗? (与 MySQL 中的输出相同)

提前谢谢你。

【问题讨论】:

    标签: mysql arrays json path amazon-redshift


    【解决方案1】:

    Redshift 只有非常基本的 JSON 操作函数集(基本上是 JSON_EXTRACT_PATH_TEXTJSON_EXTRACT_ARRAY_ELEMENT_TEXT)。处理 无模式 JSON 是不够的。

    Python UDF

    如果 Redshift 是我处理数据的唯一方法,我会尝试 python UDF。您可以在命令式 python 中编写函数。然后,拥有一个包含您的 json 对象的列,只需在所有元素上调用该函数即可进行自定义提取。

    取消嵌套 JSON 数组

    其他选择是真正尝试理解架构并使用前面提到的两个 JSON 函数来实现它(This SO 答案会给你一个关于如何爆炸/的想法在 Redshift 中取消嵌套一个 JSON 数组)。如果您的 JSON 不是任意嵌套的,而是遵循一些模式,那么这可以工作。

    正则表达式(最好不要)

    另一种绝望的方法是尝试使用正则表达式提取数据 - 可能适用于简单的情况,但这是一个简单的方法。

    【讨论】:

      【解决方案2】:

      感谢您的回答。

      我终于找到了使用 Python 的解决方案。我希望它可以帮助其他人。

      count=[x.count("title2") for x in df['myJSON'].tolist()]

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-07-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-11
        • 1970-01-01
        相关资源
        最近更新 更多