如何使用Redshift提取JSON数组中的所有元素?

1 人关注

我想从一个JSON中提取所有标题为'title2'的元素,这个JSON里面有更多的JSON嵌套。我有在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
DonWizu
DonWizu
发布于 2019-04-16
2 个回答
botchniaque
botchniaque
发布于 2019-04-24
已采纳
0 人赞同

Redshift只有一套非常初级的JSON操作函数(基本上是 JSON_EXTRACT_PATH_TEXT JSON_EXTRACT_ARRAY_ELEMENT_TEXT )。这对处理 无模式的 JSON来说是不够的。

Python UDF

如果Redshift是我处理数据的唯一手段,我会给 Python UDF 一个尝试。你可以用Python语言编写一个函数。然后,有一列持有你的JSON对象,只需在所有元素上调用该函数来做自定义提取。

嵌套的JSON数组

其他的选择是真正尝试理解模式,并使用之前提到的两个JSON函数来实现 (这个 SO答案会让你了解如何在Redshift中 爆炸 / unnest 一个JSON数组)。只要你的JSON不是任意嵌套的,而是遵循一些模式,这就可以了。

Regex(最好不要)

另一个绝望的方法是尝试用regex来提取你的数据--对于简单的案例来说可能是可行的,但这是一个很容易让你自食其果的方法。

DonWizu
DonWizu
发布于 2019-04-24
0 人赞同