首页 > 解决方案 > Hive:尝试映射键和值时出错

问题描述

我有一个这样的查询,我试图转换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

标签: hadoophivehiveql

解决方案


该错误表明您不能将复杂的数据类型(即数组、结构、映射)作为映射的键。这是有道理的。key 必须只有一个值,所以它必须是原始的(即 String、Int、BigInt)

但是,您的代码尝试将键作为数组放置,因此出现错误。你需要做的就是先炸开数组,然后尝试获取key和value组成一个map。

这可能会奏效。

创建表

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

在此处输入图像描述


推荐阅读