Запрос вложенных структур JSON в AWS Athena - PullRequest
0 голосов
/ 15 ноября 2018

Я получил следующий формат документа JSON с вложенными структурами

{
    "id": "p-1234-2132321-213213213-12312",
    "name": "athena to the rescue",
    "groups": [
        {
            "strategy_group": "anyOf",
            "conditions": [
                {
                    "strategy_conditions": "anyOf",
                    "entries": [
                        {
                            "c_key": "service",
                            "C_operation": "isOneOf",
                            "C_value": "mambo,bambo,jumbo"
                        },
                        {
                            "c_key": "hostname",
                            "C_operation": "is",
                            "C_value": "lols"
                        }
                    ]
                }
            ]
        }
    ],
    "tags": [
        "aaa",
        "bbb",
        "ccc"
    ]
}

Я создал таблицу в Афинах, чтобы поддержать ее, используя

CREATE EXTERNAL TABLE IF NOT EXISTS filters ( id string, name string, tags array<string>, groups array<struct<
    strategy_group:string,
    conditions:array<struct<
        strategy_conditions:string,
        entries: array<struct<
            c_key:string,
            c_operation:string,
            c_value:string
        >>
    >>
>> ) row format serde 'org.openx.data.jsonserde.JsonSerDe' location 's3://filterios/policies/';

Моя цель на данный момент - это запрос по столбцам записей условий. Я пробовал некоторые запросы, однако язык sql не самая большая моя профессия;)

Я получил в данный момент этот запрос, который дает мне записи

select cnds.entries from 
filters,
UNNEST(filters.groups) AS t(grps),
UNNEST(grps.conditions) AS t(cnds)

Однако, поскольку это сложный массив, он дает мне некоторую головную боль, что было бы правильным способом запроса.

Любые советы приветствуются!

спасибо R

1 Ответ

0 голосов
/ 24 ноября 2018

Я не уверен, правильно ли я понял ваш запрос. Посмотрите на этот пример ниже, может быть, он будет вам полезен.

select id, name, tags,
grps.strategy_group,
cnds.strategy_conditions,
enes.c_key,enes.c_operation, enes.c_value from 
filters,
UNNEST(filters.groups) AS t(grps),
UNNEST(grps.conditions) AS t(cnds),
UNNEST(cnds.entries) AS t(enes)
where enes.c_key='service'
...