我有一个配置单元表作为
create table tab(
col1 map<string,array<string>>)
看起来像
select key,value from tab lateral view explode(col1) e as key, value;
key | value
-------------------
a | ['1','2','3']
b | ['4','5','6']
a | ['7','8','9']
b | ['12',11','12']
现在我想得到每个键的值大小的总和。也就是说,我想看看像这样的
{'a':6,'b':6}
我知道我可以做一些类似的事情
select key,sum(size(value)) from tab lateral view explode(col1) e as key, value group by key;
它给了我
a 6
b 6
但是我希望上面的结果在一个映射中,因为我将使用它来向我的目标表中插入语句,该表期望map<string,int>
我怎样才能做到这一点?
我试过
select map(key,sum(size(value))) from tab lateral view explode(col1) e as key, value group by key;
但很明显,它只是给了我
{'a': 6}
{'b': 6}
说到标准配置单元函数,您需要最终的collect_list
聚合和str_to_map
UDF:
select str_to_map(concat_ws(',', collect_list(concat(t.key, ':', t.value)))) as result_map
from (
select key, sum(size(value)) as value
from tab
lateral view explode(col1) e as key, value
group by key
) t
还可以看看Brickhouse Collect UDAF(直接链接到代码(:这可能比在转换过程中创建字符串更有效。