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');

按用户分组,取出每个用户每天看过的所有视频的名字:

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

但是上面的查询结果有点问题,因为霸王别姬实在太好看了,所以李四这家伙看了两遍,这直接就导致得到的观看过视频列表有重复的,所以应该增加去重,使用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不是分组列,依然能够取出这列中的数据。

.

最新文章

  1. PHP入门part4
  2. AD管理命令
  3. Java中的三目运算符 详解
  4. 利用IKVM在C#中调Java程序
  5. Python的Ftplib问题:UnicodeEncodeError: 'latin-1' codec can't encode characters的解决方法
  6. JS瀑布流效果
  7. IOS开发-OC学习-protocol(协议)
  8. 【Unity3d游戏开发】游戏中的贝塞尔曲线以及其在Unity中的实现
  9. Windows 修改电脑属性(一)
  10. BST(二叉搜索树)相关
  11. 5G到来,App的未来,是JavaScript,Flutter还是Native ?
  12. UVA 10791 -唯一分解定理的应用
  13. 51nod 1101 换零钱 (完全背包)
  14. free命令常用参数详解
  15. Vim 学习
  16. Ubuntu16.04 python import cv2
  17. springmvc+mybatis 构建cms+UC浏览器文章功能
  18. spring mvc 提交表单汉字乱码
  19. Nginx服务状态的监控
  20. 【大数据之数据仓库】kudu性能测试报告分析

热门文章

  1. 函数调用时形参的传递也会被认为是赋值操作(继承自Object后会出现的问题)
  2. Struts1 工作流程
  3. Backdooring a OS VM
  4. MT【120】保三角函数
  5. Android指纹识别API讲解,让你有更好的用户体验
  6. Tengine,轻量级Web服务器
  7. 服务器启动完成执行定时任务Timer,TimerTask
  8. BZOJ 2720: [Violet 5]列队春游
  9. Linux中cd test和cd /test以及类似命令的区别
  10. k最近邻算法(kNN)