У меня есть столбец таблицы улья как
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' ': строка