Как использовать Hive для анализа нескольких вложенных массивов JSON - PullRequest
0 голосов
/ 28 мая 2020
{
    "base": {
        "code": "xm",
        "name": "project"
    },
    "list": [{
        "ACode": "cp1",
        "AName": "Product1",
        "BList": [{
            "BCode": "gn1",
            "BName": "Feature1"
        }, {
            "BCode": "gn2",
            "BName": "Feature2"
        }]
    }, {
        "ACode": "cp2",
        "AName": "Product2",
        "BList": [{
            "BCode": "gn1",
            "BName": "Feature1"
        }]
    }]
}

JSON вот так, хочу это

| code | name    | ACode | Aname    | Bcode | Bname    |
| ---- | ------- | ----- | -------- | ----- | -------- |
| xm   | project | cp1   | Product1 | gn1   | Feature1 |
| xm   | project | cp1   | Product1 | gn2   | Feature2 |
| xm   | project | cp2   | Product2 | gn1   | Feature1 |

Я пытаюсь использовать это

SELECT
    code
  , name
  , get_json_object(t.list, '$.[*].ACode')          AS ACode
  , get_json_object(t.list, '$.[*].AName')          AS AName
  , get_json_object(t.list, '$.[*].BList[*].BCode') AS BCode
  , get_json_object(t.list, '$.[*].BList[*].BName') AS BName
FROM
    (
        SELECT
            get_json_object(t.value, '$.base.code') AS code
          , get_json_object(t.value, '$.base.name') AS name
          , get_json_object(t.value, '$.list')      AS list
        FROM
            (
                SELECT
                    '{"base":{"code":"xm","name":"project"},"list":[{"ACode":"cp1","AName":"Product1","BList":[{"BCode":"gn1","BName":"Feature1"},{"BCode":"gn2","BName":"Feature2"}]},{"ACode":"cp2","AName":"Product2","BList":[{"BCode":"gn1","BName":"Feature1"}]}]}' as value
            )
            t
    )
    t
;

получить это

xm  project ["cp1","cp2"]   ["Product1","Product2"] ["gn1","gn2","gn1"] ["Feature1","Feature2","Feature1"]

НО Я обнаружил, что он сгенерирует шесть строк. Кажется, это декартово произведение. И я пытаюсь использовать split (string, "\}, \ {"), но это одновременно разделит внутренний слой. Я надеюсь получить помощь.

1 Ответ

0 голосов
/ 28 мая 2020

Решаю !!

SELECT
    code
  , name
  , ai.ACode
  , ai.AName
  , p.BCode
  , p.BName
FROM
    (
        SELECT
            get_json_object(t.value, '$.base.code') AS code
          , get_json_object(t.value, '$.base.name') AS name
          , get_json_object(t.value, '$.list')      AS list
        FROM
            (
                SELECT
                    '{"base":{"code":"xm","name":"project"},"list":[{"ACode":"cp1","AName":"Product1","BList":[{"BCode":"gn1","BName":"Feature1"},{"BCode":"gn2","BName":"Feature2"}]},{"ACode":"cp2","AName":"Product2","BList":[{"BCode":"gn1","BName":"Feature1"}]}]}' as value
            )
            t 
    )
    t 
    lateral view explode(split(regexp_replace(regexp_extract(list,'^\\[(.+)\\]$',1),'\\}\\]\\}\\,\\{', '\\}\\]\\}\\|\\|\\{'),'\\|\\|')) list as a
    lateral view json_tuple(a,'ACode','AName','BList') ai as ACode
  , AName
  , BList 
  lateral view explode(split(regexp_replace(regexp_extract(BList,'^\\[(.+)\\]$',1),'\\}\\,\\{', '\\}\\|\\|\\{'),'\\|\\|')) BList as b 
  lateral view json_tuple(b,'BCode','BName') p as BCode
  , BName
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...