hadoop - 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
解决方案
该错误表明您不能将复杂的数据类型(即数组、结构、映射)作为映射的键。这是有道理的。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
推荐阅读
- angular - angular 7.0.5 ng new 不问是否要添加 Angular 路由?....等
- python - 错误信息:函数不可调用,不知道出了什么问题?
- reactjs - 如何在 Gatsby 中将 js 添加到 React 组件中?
- bixby - 如何使用模拟器在 Bixby Studio SDK 上编译代码?
- c - fgets 在 Linux 和 Windows 中从同一个文件中写入不同的字符串
- scala - 除了 Apache Kafka 之外,还有哪些事件溯源替代方案?
- python - 按法线旋转 vtkDiskSource/vtkPolyDataMapper
- firebase - 如何限制用户可以在 Firebase 中发送的查询数量
- r - 使用对不同数据框中的另一个变量的条件创建一个新变量
- ios - 对 JSON 进行排序以查找字符串不同的每个实例