博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Hive系统函数之collect_list和collect_set
阅读量:4694 次
发布时间:2019-06-09

本文共 1039 字,大约阅读时间需要 3 分钟。

转自:

Hive中collect相关的函数有collect_list和collect_set。

它们都是将分组中的某列转为一个数组返回,不同的是collect_list不去重而collect_set去重。

 

做简单的实验加深理解,创建一张实验用表,存放用户每天点播视频的记录:

create table t_visit_video (    username string,    video_name string) partitioned by (day string)row format delimited fields terminated by ',';

在本地文件系统创建测试数据文件:

张三,大唐双龙传李四,天下无贼张三,神探狄仁杰李四,霸王别姬李四,霸王别姬王五,机器人总动员王五,放牛班的春天王五,盗梦空间

 

将数据加载到Hive表:

load data local inpath '/root/hive/visit.data' into table t_visit_video partition (day='20180516');

 

 但是上面的查询结果有点问题,因为霸王别姬实在太好看了,所以李四这家伙看了两遍,这直接就导致得到的观看过视频列表有重复的,所以应该增加去重,使用collect_set,其与collect_list的区别就是会去重:

select username, collect_set(video_name) from t_visit_video group by username;

 李四的观看记录中霸王别姬只出现了一次,实现了去重效果。

 

突破group by限制

还可以利用collect来突破group by的限制,Hive中在group by查询的时候要求出现在select后面的列都必须是出现在group by后面的,即select列必须是作为分组依据的列,但是有的时候我们想根据A进行分组然后随便取出每个分组中的一个B,代入到这个实验中就是按照用户进行分组,然后随便拿出一个他看过的视频名称即可:

select username, collect_list(video_name)[0] from t_visit_video group by username;

 video_name不是分组列,依然能够取出这列中的数据。

转载于:https://www.cnblogs.com/blazeZzz/p/11541600.html

你可能感兴趣的文章
asp.net如何定时执行任务
查看>>
在github上实现页面托管预览功能
查看>>
css选择器
查看>>
prim
查看>>
给陌生人写一封信
查看>>
noip2013花匠
查看>>
[CF]Equalize Them All
查看>>
React Ant design table表单与pagination分页配置
查看>>
重大发现: windows下C++ UI库 UI神器-SOUI(转载)
查看>>
linux 压缩文件的命令总结
查看>>
linux tail 命令详解
查看>>
BZOJ-3207 花神的嘲讽计划Ⅰ
查看>>
BZOJ-1069 [SCOI2007]最大土地面积
查看>>
进程与线程的一个简单解释【摘】
查看>>
COJ976 WZJ的数据结构(负二十四)
查看>>
slid.es – 创建在线幻灯片和演示文稿的最佳途径
查看>>
2016年6月份那些最实用的 jQuery 插件专辑
查看>>
如何在数据库中使用索引
查看>>
ring0
查看>>
windows虚拟机下 安装docker 踩过的坑
查看>>