今天又get到一个小技能,collect_set函数

collect_set函数

今天又get到一个小技能,掌握了hive一个关于列转行专用函数 collect_set函数。

在这里做个学习笔记。

collect_set是Hive内置的一个聚合函数, 结果返回一个消除了重复元素的对象集合, 其返回值类型是 array 。

和collect_set相似的还有另一个函数collect_list,这个我们后面再谈。

在实际应用中,我们可能会遇到需要类似这样的一个需求,就是需要查出各个品牌对应的所有分类,

品牌分类表数据结构大概是这样的:

brand_name,brand_classify

品牌1 家电

品牌1 家具

品牌1 数码

品牌2 空调

品牌2 饮水机

期望的结果是:

品牌1 家电,家具,数码

品牌2 空调,饮水机

这时候我们就可以使用collect_set函数来实现我们的需求。

sql 复制代码
select
brand_name,
concat_ws(',', collect_set(brand_classify)) as brand_classify
from tb_brand_classify
group by brand_name;

使用了collect_set函数,是不是感觉很容易就实现了需求。

下面我们来实践操作下,这样印象会更深刻些。

1.创建原始表 品牌分类表 tb_brand_classify

sql 复制代码
drop table if exists tb_brand_classify;create table if not exists tb_brand_classify (brand_name string, brand_classify string);

2.初始化数据

sql 复制代码
insert into table tb_brand_classify values('品牌1','家电');
insert into table tb_brand_classify values('品牌1','家具');
insert into table tb_brand_classify values('品牌1','数码');
insert into table tb_brand_classify values('品牌2','空调');
insert into table tb_brand_classify values('品牌2','饮水机');

3.查询表的数据

cs 复制代码
select * from tb_brand_classify

执行结果:

4.上述的需求我就可以使用 collect_set 函数来实现, 具体sql如下:

sql 复制代码
select
brand_name,
concat_ws(',', collect_set(brand_classify)) as brand_classify
from tb_brand_classify
group by brand_name;

执行结果:

拓展:

还可以用下标可以取具体某一个

sql 复制代码
select
brand_name,
collect_set(brand_classify)[0]
from tb_brand_classify
group by brand_name;

执行结果:

文章开头我们提到了collect_list函数,collect_list与collect_set最大的区别就是列的值不去重;我们把collect_set换成collect_list 执行看下。

sql 复制代码
select 
brand_name, 
concat_ws(',', collect_list(brand_classify)) 
from tb_brand_classify group by brand_name;

发现跟之前是一样的,那是因为我们的类目中没有重复,要是有重复,使用collect_list就会重复了。

需要注意的是collect_set是无序集合,如果需要排序我们可以改成collect_list或sort_array进行排序。

javascript 复制代码
concat_ws(',', sort_array(collect_set(brand_classify), false))

sort_array(e: column, asc: boolean)将array中元素排序(自然排序),默认asc。

好了,今天的分享就先到这。

由于水平有限,文中纰漏之处在所难免,欢迎大家批评指正。

相关推荐
RestCloud44 分钟前
Informatica迁移国产ETL完整实施指南:ETLCloud自动化平滑替换方案
数据仓库·etl·etlcloud·数据传输·数据集成工具·informatica·国产化替代
莫名的好感°2 小时前
国内AI视频工具哪家强?FusionAI聚合即梦Seedance、可灵Kling、HappyHorse、Google Veo,一个平台看懂所有选择
大数据·人工智能
咖啡星人k2 小时前
企业内网引入 AI 编程:MonkeyCode 私有化部署思路
大数据·人工智能·私有化部署·monkeycode
oort1233 小时前
吃上了自家的细糠,还挺丝滑,用起来手感还行,OortCloud发布新版AI编程平台,下载 OortCodex,Token多,免费薅
大数据·开发语言·人工智能·ai编程
AI小码3 小时前
把动作「画」给视频世界模型,跨本体双向推演,李飞飞参与
大数据·人工智能·算法·ai·大模型·音视频·编程
Elastic 中国社区官方博客5 小时前
不到 5 分钟完成本地部署:Jina embedding 模型现已支持本地部署
大数据·人工智能·elasticsearch·搜索引擎·embedding·jina
二进制流水搬运工5 小时前
入职第一天拉了23个仓库,我写了个脚本解放双手
大数据·elasticsearch·搜索引擎
Meya11275 小时前
实时采集 + 全域可视化,打造跨站点机房一体化U位管理方案
大数据·运维·人工智能
Gofarlic_OMS6 小时前
NX浮动许可调度黑名单机制,对比两款谁更合理
java·大数据·运维·开源·制造
万岳科技系统开发6 小时前
智慧医院小程序开发推动医疗服务流程全面线上化
大数据·开发语言·人工智能