1.order by
全局排序,只有一个Reducer(多个reducer无法保证全局有序),会导致当输入规模较大时,消耗较长的计算时间
hive.mapred.mode = strict 模式下 必须指定 limit 否则执行会报错。
2.sort by
不是全局排序,其在数据进入reducer前(map)完成排序,也就是说它会在数据进入reduce之前为每个reducer都产生一个排序后的文件。
因此,如果用sort by进行排序,并且设置mapreduce.job.reduces>1,则sort by只保证每个reducer的输出有序,不保证全局有序。
order by和sort by执行效率对比
一般情况下我们认为sort by 应该是比 order by 快的,因为 order by 只能使用一个reducer,进行全部排序,但是当数据量比较小的时候就不一定了,因为reducer 的启动耗时可能远远数据处理的时间长
3.distribute by
控制在map端如何拆分数据给reduce端的,hive会根据distribute by后面列,将数据分发给对应的reducer,默认是采用hash算法+取余数的方式。
4.cluster by
cluster by除了具有distribute by的功能外还兼具sort by的功能。但是排序只能是升序排序,当分区字段和排序字段相同cluster by可以简化distribute by+sort by 的SQL 写法
总结:
- order by 是全局排序,可能性能会比较差;
- sort by分区内有序,往往配合distribute by来确定该分区都有那些数据;
- distribute by 确定了数据分发的规则,满足相同条件的数据被分发到一个reducer;
- cluster by 当distribute by和sort by 字段相同时,可以使用cluster by 代替distribute by和sort by,但是cluster by默认是升序,不能指定排序方向;
- sort by limit 相当于每个reduce 的数据limit 之后,进行order by 然后再limit ;