Hive支持两个层面的排序:
全局排序 部分排序全局排序用
order by col [ASC | DESC]
实现,效果和传统的RDMS一样,保证最后的数据全局有序。
部分排序用
sort by col [ASC | DESC]
实现,保证同一个reducer
处理的数据有序,对于结果数据则表现为局部有序。
Hive对用户提供的同样是SQL,但底层实现却和传统数据库有天壤区别,底层实现默默情况下是利用了Hadoop的计算框架MapReduce,当然也支持使用Spark, Tez。鉴于此,Hive有一些自己特定,比如order by
的实现需要把所有数据汇集到一个reducer
中处理,如果数据量巨大,这个一步将会成为整个任务的潜在问题点,所以Hive在严格模式下(hive.mapred.mode=strict)时,使用order by
必须搭配使用limit
。
同时是由于Hive底层的实现机制的原因,Hive有两个相关的字句distribute by
和cluster by
。
distribute by
确保具有相同分区键的数据全部被分配到同一个reducer
处理。
cluster by
确保具有相同分区键的数据全部被分配到同一个reducer
处理,同时确保同一个reducer
中的数据顺序。相当于:
disribute by col sort by col
不过分开或组合使用disribute by
显得更加灵活:
sort by
只负责排序,数据的划分则是随机划分到reducer
distribute by
和sort by
可以作用于不同的列上,一个常用的情景是
disribute by col_A sort by col_A,col_B