从 Amazon Redshift 中的 json 数组中提取特定键

Posted

技术标签:

【中文标题】从 Amazon Redshift 中的 json 数组中提取特定键【英文标题】:Extract specific key from array of jsons in Amazon Redshift 【发布时间】:2021-06-20 18:52:22 【问题描述】:

背景

我正在使用 SQL 在 Amazon Redshift 数据库中工作。我有一个表,其中一个名为 attributes 的列包含如下所示的数据:

["name": "Color", "value": "Beige","name":"Size", "value":Small"]

["name": "Size", "value": "Small","name": "Color", "value": "Blue","name": "Material", "value": "Cotton"]

据我了解,以上是JSON字符串中的一系列路径元素。

问题

我希望提取每个 JSON 字符串中的颜色值。我不确定如何进行。我知道如果颜色在同一个位置,我可以使用索引来指示从哪里提取。但这里不是这样。

我尝试了什么

select json_extract_array_element_text(attributes, 1) as color_value, json_extract_path_text(color_value, 'value') as color from my_table

此查询适用于某些列,但并非所有列,因为颜色值的位置不同。

我很感激这里的任何帮助,因为我对 sql 非常陌生,并且只进行了基本的查询。我一直使用以下page作为参考

【问题讨论】:

您正在突破 SQL 的极限。你会考虑Creating a scalar Python UDF - Amazon Redshift提取信息吗? 【参考方案1】:

首先,您的数据是数组格式(在 [ ] 之间),而不是对象格式(在 之间)。您提到的页面是用于从 JSON 对象而非数组中提取数据的函数。数组格式也带来了挑战,因为您需要知道要提取的元素的数字位置。

根据您的示例数据,对象似乎是要走的路。如果是这样,您将希望重新格式化您的数据,使其更像:

"Color": "Beige", "Size": "Small"

"Size": "Small", "Color": "Blue", "Material": "Cotton"

仅当“名称”值在您的数据中是唯一的时,此转换才有效。

有了这个你选择的函数 - JSON_EXTRACT_PATH_TEXT() - 将从数据中提取你想要的值。

现在更改数据可能不是一种选择,处理这些数组会使事情变得更加困难和性能降低。为此,您需要通过与一组数字交叉连接来扩展这些数组,这些数字包含数组最大长度内的所有数字。例如,对于您提供的示例,您需要通过值 0、1、2 进行交叉连接,以便可以完全提取 3 元素数组。然后,您可以只过滤那些“名称”为“颜色”的行。

从数组中提取元素所需的函数是 JSON_EXTRACT_ARRAY_ELEMENT_TEXT(),由于数组中存储有对象,因此需要对结果运行 JSON_EXTRACT_PATH_TEXT()。

【讨论】:

以上是关于从 Amazon Redshift 中的 json 数组中提取特定键的主要内容,如果未能解决你的问题,请参考以下文章

Amazon Redshift 从 JSON 获取所有密钥

复制 json 文件时出现 Amazon Redshift 错误 - JSONPath 格式无效:成员不是对象

为啥 Amazon Redshift 会截断此 JSON 浮点数据的精度?

在 Amazon Redshift 中的表之间传输数据

基准 Amazon Redshift JSON_EXTRACT_PATH_TEXT

Amazon Redshift 使用 COPY 命令仅从 JSON 中获取 1 行