Улей: Фильтр массив карт - PullRequest
       11

Улей: Фильтр массив карт

0 голосов
/ 10 апреля 2020

У меня есть столбец таблицы улья как

col1                array<map<string,string>>

Этот столбец содержит значения как

[
    {'a':1,'b':2},
    {'a':1,'c':3},
    .
    .
    .
]

, теперь ключи на внутренней карте могут различаться для каждого элемента. Я хочу отфильтровать массив, чтобы получить только те элементы, где присутствует ключ b. Можно ли добиться этого с помощью array_contains? Я пытался, но я получил ошибку

select col1 from mytab where size(col1) > 0 and array_contains(col1, 'b');
FAILED: SemanticException [Error 10016]: Line 1:196 Argument type mismatch ''b'': "map<string,string>" expected at function ARRAY_CONTAINS, but "string" is found

, что очевидно, но я все равно пытался.

Обновление

Я пытался

select res from mytab LATERAL VIEW EXPLODE (col1) c as res where 
 size(col1) > 0 and res is not NULL and length(res) > 0;

за это я получаю

{}
{a=1, b=2}
{a=1, b=2}
{}

, что хорошо, но как мне избежать пустых результатов, например {}?

Обновление 2

Мне удалось удалить пустые результаты как

select res from mytab LATERAL VIEW EXPLODE (col1) c as res where 
     size(col1) > 0 and res['b'] is not NULL and length(res['b']) > 0 res <> '{}';

Последний вопрос: как преобразовать res из строки в правильную карту? Я хочу иметь некоторые условия, используя ключи в Res. Я пытался

select str_to_map(res) as st from mytab LATERAL VIEW EXPLODE (col1) c as res where 
         size(col1) > 0 and res is not NULL and length(res) > 0 res <> '{}';

, но я получаю

{"{a=1, b=2}":null}

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

select res['b'] from mytab LATERAL VIEW EXPLODE (col1) c as res where 
     size(col1) > 0 and res['b'] is not NULL and length(res) > 0 res['b'] <> '{}' and res['b']=1;

, но я получаю

FAILED: SemanticException [Ошибка 10033]: строка 1: 237 [] недопустима для типов не из коллекции ' 'b' ': строка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...