1 ORDER BY和SORT BY
ORDER BY:对查询结果集执行一个全局排序。所有的数据都通过一个reducer进行处理。对于大数据集,这个过程可能会消耗太过漫长的时间来执行。HIVE-3562 引入了一个针对 TopN 的优化,即将带有 limit 算子的 order by 推至 map 端,这样 map 不必将所有数据 shuffle 到 reduce。order by 和 limit 算子在日常使用场景中经常一起出现,因此这个优化就显得很有必要。
因为ORDER BY操作可能会导致运行时间过长,如果属性hive.mapred.mode的值是strict的话,那么 Hive要求这样的语句必须加有LIMIT语句进行限制。默认情况下,这个属性的值是nonstrict,也就是不会有这样的限制。
使用方式:一般配合limit,用于计算top N。
SORT BY:只会在每个reducer中对数据进行排序,也就是执行一个局部排序过程。这可以保证每个reducer的输出数据都是有序的(但并非全局有序)。这样可以提高后面进行的全局排序的效率。
使用方式:一般配合distribute by使用。
2 含有SORT BY 的DISTRIBUTE BY
distribute by会根据指定字段的值,将记录分发到不同的reduce中,默认是对指定列的值取hash值,然后hash值对reduce的个数取模,每个模数都对应着一个reduce,这样含有相同字段值的记录会进入同一个reduce中,但是每个reduce中的数据并不是有序的,它只是负责将不同的记录分发到指定的reduce中,无法保证有序排列。
通常,将distribute by和sort by连用,这样在将指定字段的记录分发到不同的reduce中,并且每个reduce内部会根据指定字段值来排序。
与group by区别
都是按key值划分数据,都使用reduce操作。唯一不同的是,distribute by只是单纯的分散数据,distribute by col – 按照col列把数据分散到不同的reduce。而group by把相同key的数据聚集到一起,后续必须是聚合操作。
3 CLUSTER BY
把有相同值的数据聚集到一起,并排序,效果等价于distribute by col sort by col。
即 cluster by col <==> distribute by col sort by col
面试指数:★★
参考文档:
https://developer.aliyun.com/article/694756
https://blog.csdn.net/u012369535/article/details/89639434