#sql #arrays #json #hive #hiveql
Вопрос:
[{"name":"john","id":12,"location":"delhi"},{"name":"raj","id":18,"location":"mumbai"},{"name":"Rahul","id":14,"location":"hyd"}]
У меня есть эта строка(не структура) после использования get_json_object
в одной записи в таблице hive. Мне нужно взорвать это,чтобы создать новую таблицу с именами столбцов в виде имени, идентификатора и местоположения. Может кто-нибудь помочь.
Explode()
или inline()
принимает массив структуры. Пробовал explode(Array(struct(my get_json_object output)))
, но это не дает ожидаемого результата.
Комментарии:
1. Во втором и третьем объекте в вашем JSON ключ
name
неправильно заключен в двойные кавычки. Имеет ли это какое-то значение?2. Извините. Это была опечатка при размещении его здесь. Фактические данные не имеют этой проблемы
Ответ №1:
Сначала преобразуйте строку в массив объектов JSON: удалите квадратные скобки, разделите их запятой между фигурными скобками и разнесите. Затем используйте json_tuple с боковым видом, чтобы извлечь все значения. Смотрите эту демонстрацию:
with mytable as (--demo table, use your table instead
select '[{"name":"john","id":12,"location":"delhi"},{"name":"raj","id":18,"location":"mumbai"},{"name":"Rahul","id":14,"location":"hyd"}]' as json_string
)
select --t.json_string as original_string, --commented
e.pos as position_in_array,
--values from json
x.name, x.id, x.location
from mytable t
lateral view outer posexplode( split(regexp_replace(json_string,'^\[|\]
Результат:
position_in_array x.name x.id x.location
0 john 12 delhi
1 raj 18 mumbai
2 Rahul 14 hyd
Результат:
,''), --remove []
'(?<=\}),(?=\{)' --split by comma only after } and before {
) --converted to array of json strings
)e as pos, json --exploded array element with position
--extract all from e.json
lateral view json_tuple(e.json,'name', 'id', 'location') x as name, id, location