我想从内部嵌套了更多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中的输出相同)
谢谢。
答案 0 :(得分:0)
Redshift仅对JSON操作功能(基本为JSON_EXTRACT_PATH_TEXT和JSON_EXTRACT_ARRAY_ELEMENT_TEXT)进行了基本设置。仅仅处理 schemaless JSON是不够的。
如果Redshift是我处理数据的唯一方法,我将尝试python UDF。您可以在命令式python中编写函数。然后,有一列保存您的json对象,然后在所有元素上调用该函数以进行自定义提取。
其他选择是真正尝试理解模式并使用前面提到的两个JSON功能实现它(This因此,答案将为您提供有关如何爆炸 / < em> unnest Redshift中的JSON数组)。如果您的JSON不是任意嵌套的,但是遵循某些模式,则可以使用。
另一种绝望的方法是尝试使用正则表达式提取数据-可以在简单的情况下使用,但这是一种用脚射击自己的简单方法。
答案 1 :(得分:0)
感谢您的回答。
我终于找到了使用Python的解决方案。希望对其他人有所帮助。
count=[x.count("title2") for x in df['myJSON'].tolist()]