HIVE: как получить доступ к элементам в объекте MAP - PullRequest
0 голосов
/ 11 марта 2020

в моей таблице HIVE MYTABLE У меня есть один столбец " MYCOL ", который содержит это:

{"id": "a651b57f", 

 "items": {
    "ITEM1": {
        "code": "CODE1", 
        "name": "NAME1"}, 
    "ITEM2": {
        "code": "CODE2", 
        "name": "NAME2"}}, 

 "myinfo": {
    "c7daf1a9": {
        "id": "c7daf1a9", 
        "name": "newname", 
        "type": "newtype", 
        "appliedto": ["ITEM1", "ITEM2"]}}, 

 "info2": 12}

Я хотел бы получить доступ к элементам в "myinfo "и я попробовал что-то вроде этого:

select  GET_JSON_OBJECT(t.MYCOL,'$.myinfo') FROM MYTABLE

но это не работает ....

может кто-нибудь мне помочь?

спасибо

1 Ответ

0 голосов
/ 11 марта 2020

Убедитесь, что данные в файле HDFS имеют one line для each json row (не несколько новых строк для одной строки).

  • Если строка json имеет несколько новых строк, тогда нам нужно заменить все новые строки для каждой строки перед сохранением в HDFS.

Пример:

HDFS file data:

{"id": "a651b57f","items": {"ITEM1": {"code": "CODE1","name": "NAME1"},"ITEM2": {"code": "CODE2","name": "NAME2"}},"myinfo": {"c7daf1a9": {"id": "c7daf1a9","name": "newname","type": "newtype","appliedto": ["ITEM1", "ITEM2"]}},"info2": 12}

Hive:

with cte as (select string('{"id": "a651b57f","items": {"ITEM1": {"code": "CODE1","name": "NAME1"},"ITEM2": {"code": "CODE2","name": "NAME2"}},"myinfo": {"c7daf1a9": {"id": "c7daf1a9","name": "newname","type": "newtype","appliedto": ["ITEM1", "ITEM2"]}},"info2": 12}')my_col) --sample data
select get_json_object(my_col,'$.myinfo')jsn from cte;

Output:

{"c7daf1a9":{"id":"c7daf1a9","name":"newname","type":"newtype","appliedto":["ITEM1","ITEM2"]}}

Update

--to access name subfield we need to specify the path of json object
hive> select get_json_object(my_col,'$.myinfo.c7daf1a9.name')jsn from <table_name>;
--result
newname

hive> select get_json_object(my_col,'$.myinfo.c7daf1a9.appliedto')jsn from <table_name>;
--result
["ITEM1","ITEM2"]

hive> select get_json_object(my_col,'$.myinfo.c7daf1a9.appliedto[0]')jsn from <table_name>;
--result
ITEM1
...