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

时间:2019-04-16 10:24:51

标签: mysql arrays json path amazon-redshift

我想从内部嵌套了更多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中的输出相同)

谢谢。

2 个答案:

答案 0 :(得分:0)

Redshift仅对JSON操作功能(基本为JSON_EXTRACT_PATH_TEXTJSON_EXTRACT_ARRAY_ELEMENT_TEXT)进行了基本设置。仅仅处理 schemaless JSON是不够的。

Python UDF

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

取消嵌套JSON数组

其他选择是真正尝试理解模式并使用前面提到的两个JSON功能实现它(This因此,答案将为您提供有关如何爆炸 / < em> unnest Redshift中的JSON数组)。如果您的JSON不是任意嵌套的,但是遵循某些模式,则可以使用。

正则表达式(最好不要这么做)

另一种绝望的方法是尝试使用正则表达式提取数据-可以在简单的情况下使用,但这是一种用脚射击自己的简单方法。

答案 1 :(得分:0)

感谢您的回答。

我终于找到了使用Python的解决方案。希望对其他人有所帮助。

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