首页 > 解决方案 > Hive:按属性将值聚合到 JSON 或 MAP 字段中

问题描述

我有一个看起来像这样的表:

|   user | attribute   |   value |
|--------|-------------|---------|
|      1 | A           |      10 |
|      1 | A           |      20 |
|      1 | B           |       5 |
|      2 | B           |      10 |
|      2 | B           |      15 |
|      2 | C           |     100 |
|      2 | C           |     200 |

我想对这个表进行分组user并将字段的总和收集value到一个 JSON 或一个以属性为键的 MAP 中,例如:

| user | sum_values_by_attribute  |
|------|--------------------------|
|    1 | {"A": 30, "B": 15}       |
|    2 | {"B": 25, "C": 300}      |

有没有办法在 Hive 中做到这一点?

我发现了诸如thisthis之类的相关问题,但没有人考虑对值求和的情况。

标签: sqljsondictionaryhivehiveql

解决方案


您可以先通过属性和 user_id 计算总和,然后使用收集列表。请让我知道以下输出是否正常。 在此处输入图像描述

下面的 SQL -

select `user`,
collect_list(concat(att,":",cast(val as string))) sum_values_by_attribute  
from 
(select `user`,`attribute` att, sum(`value`) val from tmp2 group by u,att) tmp2
group by `user`;

测试查询 -

create table tmp2 ( `user` int, `attribute` string, `value` int);

insert into tmp2 select 1,'A',40;
insert into tmp2 select 1,'A',20;
insert into tmp2 select 1,'B',5;
insert into tmp2 select 2,'C',20;
insert into tmp2 select 1,'B',10;
insert into tmp2 select 2,'B',10;
insert into tmp2 select 2,'C',10;

select `user`,
collect_list(concat(att,":",cast(val as string))) sum_values_by_attribute  
from 
(select `user`,`attribute` att, sum(`value`) val from tmp2 group by u,att) tmp2
group by `user`;

推荐阅读