文章目录
- 1.总结
- 2.order by
- 3.sort by
- 4.distribute by
- 5.distribute by + sort by
- 6.Cluster by
- 7.group by 和distribute by的区别
1.总结
- order by:全局有序,但是会导致执行时间长或者任务集中。
- sort by:局部有序,对每个reduce进行排序
- distribute by:控制在map端如何拆分数据给reduce端的。划分map的数据流,使相同key传入一个reduce
一般来说distribute by 和sort by会放在一起使用,统计每个种类的topn
- cluster by:distribute by + sort by(前提是列相同)
但是使用cluster by会抛弃sort by的并行性,可以实现输出文件的全局有序性
- 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的结果是按组有序而全局无序的,输入数据经过了以下两个步骤的处理:
- 根据KEY字段被HASH,相同组的数据被分发到相同的reducer节点;
- 对每个组内部做排序
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配合使用。