Как извлечь все элементы в массиве JSON с помощью Redshift? - PullRequest
0 голосов
/ 16 апреля 2019

Я хочу извлечь из 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 output: ["b", "d","g","j"]

Моя проблема в том, что в Redshift я могу конкретно определить путь как: JSON_EXTRACT_PATH_TEXT(myJSON, 'master-title2',0,'title') Так что я могу получить только один элемент вместо всех.

Любая идея, как оценить все пути и получить все элементы в массиве JSON, которые имеют тот же "title2", используя Redshift?(тот же вывод, что и в MySQL)

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 24 апреля 2019

Спасибо за ваш ответ.

Я наконец-то нашел решение с использованием Python.Я надеюсь, что это может помочь некоторым другим.

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

0 голосов
/ 16 апреля 2019

Redshift имеет только очень элементарный набор функций манипулирования JSON (в основном JSON_EXTRACT_PATH_TEXT и JSON_EXTRACT_ARRAY_ELEMENT_TEXT ).Недостаточно иметь дело с без схемы JSON.

Python UDF

Если бы Redshift был моим единственным средством обработки данных, я бы дал python UDF aпытаться.Вы можете кодировать функцию в императивном Python.Затем, имея столбец, содержащий ваш объект json, и просто вызовите эту функцию для всех элементов, чтобы выполнить выборочное извлечение.

Unnesting JSON-массивов

Другими вариантами может быть попытка понять схему и реализовать ее, используя две функции JSON, упомянутые выше ( Этот ответ SO даст вамидея о том, как взорвать / unnest массив JSON в Redshift).Если ваш JSON не является произвольно вложенным, но следует некоторым шаблонам, это может работать.

Regex (лучше не надо)

Еще один отчаянный подход - попытаться извлечь ваши данные с помощью регулярных выражений - может сработать для простых случаев, но это простой способ выстрелить себе в ногу,

...