前言
介绍hive的四种排序函数:Order By,Sort By,Distribute By,Cluster By 简称”四by“
Order By:全局排序
对输入的所有数据做排序,故此只有一个reducer(多个reducer无法保证全局有序);
只有一个reducer,会导致当输入规模较大时,需要较长的计算时间;
1、ORDER BY 子句排序
ASC(ascend): 升序(默认)
DESC(descend): 降序
2、ORDER BY 子句在SELECT语句的结尾
3、示例:
select * from emp order by sal; (默认升序)
select * from emp order by sal DESC; (降序
Sort By:非全局排序,分区内有序
1、在数据进入reducer前完成排序, 它会在数据进入reduce之前为每个reducer都产生一个排序后的文件;
2、当mapred.reduce.tasks > 1时,只能保证每个reducer的输出有序,不保证全局有序
Distribute By:(数据分发)
控制在map端如何拆分数据给reduce端的
1、按照指定的字段对数据进行划分输出到不同的reduce中,通常是为了进行后续的聚集操作;
2、hive会根据distribute by后面列,将数据分发给对应的reducer,默认是采用hash算法+取余数的方式
3、常和sort by一起使用,并且distribute by必须在sort by前面:sort by为每个reduce产生一个排序文件,在有些情况下,需要控制某写特定的行应该到哪个reducer,这通常是为了进行后续的聚集操作。distribute by刚好可以做这件事。因此,distribute by经常和sort by配合使用。
Cluster By
相当于distribute by+sort by,只能默认升序,不能使用倒序。
当分区字段和排序字段相同cluster by可以简化distribute by+sort by 的SQL 写法,也就是说当distribute by和sort by 字段相同时,可以使用cluster by 代替distribute by和sort by。