Hive:如何在地图列上聚合并返回地图



我有一个配置单元表作为

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_mapUDF:

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(直接链接到代码(:这可能比在转换过程中创建字符串更有效。

最新更新