Hive: ошибка при попытке сопоставить ключ и значение - PullRequest
0 голосов
/ 12 ноября 2018

У меня такой запрос, где я пытаюсь преобразовать array<struct<key:string,value:array<string>> в map<string,array<string>>. Запрос

SELECT name, address, location, map(collect_set(k1),collect_set(concat_ws("",v1))) AS key_one
FROM table_a 
lateral view inline(key_one) t1 as k1,v1
GROUP BY name, address, location;

Я получаю ошибку как FAILED: SemanticException [Error 10016]: Line 1:62 Argument type mismatch 'v1': Primitive Type is expected but array<string>" is found

1 Ответ

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

Ошибка говорит о том, что вы не можете иметь сложные типы данных (например, массив, структура, карта) в качестве ключа для отображения. И это имеет смысл правильно. ключ должен быть только одно значение, поэтому он должен быть примитивным (т. е. String, Int, BigInt)

Тем не менее, ваш код пытается поместить ключ в качестве массива, и поэтому ошибка. Что вам нужно сделать, это сначала взорвать массив, а затем попытаться получить ключ и значение, чтобы сформировать карту.

Это может сработать.

создать таблицу

create table temp.test_struct (test array<struct<key:string,value:array<string>>>) 

Введите значения

insert into temp.test_struct 
select array(
            NAMED_STRUCT("key", "k1", "value", array("a","b","c")), 
            NAMED_STRUCT("key", "k2", "value", array("x","y","z"))
            ) from (select 'a') x

Конвертировать массив структур на карту

select test, map(t1.key, t1.value) map_col
from 
    temp.test_struct
lateral view inline(test) t1

enter image description here

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