sql - 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 中做到这一点?
解决方案
您可以先通过属性和 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`;
推荐阅读
- api - IHttpActionResult 生成 xml 解析器错误
- extjs - Extjs如何将新节点添加到选定节点
- javascript - 使用javascript在SVG中创建文本节点创建多个节点
- java - Java 在编辑 observableList 时抛出 IndexOutOfBounds
- android - Kotlin 通过电子邮件意图发送 html 代码作为模板
- kubernetes - 为附加端口和端点设置入口
- angular - 使用 Marbles 对外部 URL 进行单元测试 NGRX 效果
- javascript - Photoshop 用于匹配图像颜色的算法
- c# - 如何在 Unity3D 中保存和加载场景和游戏对象
- php - 如何在连接到数据库之前甚至在 MySQL 关闭时加载控制器