Hive中orderBy,sortBy,distribute by,cluster by,group by

1.总结

  1. order by:全局有序,但是会导致执行时间长或者任务集中。
  2. sort by:局部有序,对每个reduce进行排序
  3. distribute by:控制在map端如何拆分数据给reduce端的。划分map的数据流,使相同key传入一个reduce

一般来说distribute by 和sort by会放在一起使用,统计每个种类的topn

  1. cluster by:distribute by + sort by(前提是列相同)

但是使用cluster by会抛弃sort by的并行性,可以实现输出文件的全局有序性

  1. group by:对检索结果的保留行进行单纯分组,一般总爱和聚合函数一块用

group by把相同key的数据聚集到一起,后续必须是聚合操作。而distribute by仅仅是对map的数据流进行划分控制。

2.order by

首先我们要明白Hive的本质是将HiveSQL转成MapReduce来执行分布式计算的,和普通单机程序不同的一个特点就是最终的数据会产生多个子文件,每个reducer节点都会处理partition给自己的那份数据产生结果文件,这导致了在Hadoop环境下很难对数据进行全局排序。

所以如果在Hadoop上进行order by全排序,会导致所有的数据集中在一台reducer节点上,然后进行排序,这样很可能会超过单个节点的磁盘和内存存储能力导致任务失败。

因此OrderBy会导致全局排序,使用order by会引发全局排序

select * from baidu_click order by click desc;

3.sort by

sort by则指的是局部排序,它将会在每个reduce中进行局部排序。但是无法保证全局有序。
在这里插入图片描述

4.distribute by

在这里插入图片描述
distribute by 的作用是保证相同的key的键值对会发送到一个Reduce中

一般来说distribute by 会和 sort by一起使用

5.distribute by + sort by

使用distribute和sort进行分组排序

select * from baidu_click distribute by product_line sort by click desc;

distribute by + sort by可以保证不重叠的局部有序,被distribute by设定的字段为KEY,数据会被HASH分发到不同的reducer机器上,然后sort by会对同一个reducer机器上的每组数据进行局部排序。

在这里插入图片描述
distribute by + sort by的结果是按组有序而全局无序的,输入数据经过了以下两个步骤的处理:

  1. 根据KEY字段被HASH,相同组的数据被分发到相同的reducer节点;

  2. 对每个组内部做排序

6.Cluster by

Cluster by其实就是distribute by + sort by的简写

那么这两者有什么区别?

因为distribute by 指定的列可能和sort by指定的列不同,数量也可能不同:

select * from tb_orders distribute by name sort by money desc;

在这里插入图片描述

当distribute by 指定的列 和 sort by指定的列相同时,就可以直接使用Cluster by

select * from tb_orders cluster by money ;

在这里插入图片描述

因此,cluster by除了具有distribute by的功能外还兼具sort by的功能。但是排序只能是升序排序,不能指定排序规则为ASC或者DESC。

其次,如果使用了cluster by 或者distribute by + sort by(列相同),会剥夺sort by的并行行,这样的输出的文件同样是全局有序的。

7.group by 和distribute by的区别

group by是对检索结果的保留行进行单纯分组,一般总爱和聚合函数一块用例如AVG(),COUNT(),max(),main()等一块用。

distribute by是控制在map端如何拆分数据给reduce端的。hive会根据distribute by后面列,对应reduce的个数进行分发,默认是采用hash算法。sort by为每个reduce产生一个排序文件。在有些情况下,你需要控制某个特定行应该到哪个reducer,这通常是为了进行后续的聚集操作。distribute by刚好可以做这件事。因此,distribute by经常和sort by配合使用。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值