Не удается взорвать строку json в улье

#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
Результат: