Hive: извлечение данных из вложенного JSON и добавление - PullRequest
1 голос
/ 12 июня 2019

У меня есть таблица кустов с идентификаторами и JSON, как показано ниже:

id   json
----------
21 | {"temp":"3","list":[{"url":"aaa.com"},{"url":"bbb.com"}]}
42 | {"temp":"2","list":[{"url":"qqq.com"},{"url":"vvv.com"}]}

Требуемый вывод выглядит следующим образом:

id   url
----------
21 | aaa.com
21 | bbb.com
42 | qqq.com
42 | vvv.com

Кто-нибудь поможет с этим запросом улья?

Применение explode () напрямую не работает, так как столбец json является строкой.

Ответы [ 2 ]

0 голосов
/ 13 июня 2019

Попробуйте с запросом ниже:

hive> with cte as (
select stack(2,int(21),string('{"temp":"3","list":[{"url":"aaa.com"},{"url":"bbb.com"}]}'),
int(42),string('{"temp":"2","list":[{"url":"qqq.com"},{"url":"vvv.com"}]}')) as (id,json))  
select id,url from (
select id,
split(
regexp_replace(
        get_json_object(json,'$.list.url'),
  '(\\[|\\]|\")','')
 ,',')jsn from cte)t 
lateral view explode(jsn)asd as url;

Выход:

id      url
21      aaa.com
21      bbb.com
42      qqq.com
42      vvv.com

Описание функций:

Stack - используется для создания выборочных данных

get_json_object - для извлечения данных из строки json

regexp_replace - заменить [,]," символов

split - разделить на ,, и это вернет массив

explode - использовать столбец массива для взрыва

0 голосов
/ 12 июня 2019

Вы можете использовать get_json_object() и explode() методы вместе как

select id,
       get_json_object(jst.js,'$.temp.url') as url
  from ( select explode(json) as js FROM json_tab ) jst
...