全局排序,只有一个Reducer(多个reducer无法保证全局有序),会导致当输入规模较大时,消耗较长的计算时间
hive.mapred.mode = strict 模式下 必须指定 limit 否则执行会报错。
不是全局排序,其在数据进入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 的启动耗时可能远远数据处理的时间长
控制在map端如何拆分数据给reduce端的,hive会根据distribute by后面列,将数据分发给对应的reducer,默认是采用hash算法+取余数的方式。
cluster by除了具有distribute by的功能外还兼具sort by的功能。但是排序只能是升序排序,当分区字段和排序字段相同cluster by可以简化distribute by+sort by 的SQL 写法