前言
Hive中的四种排序方法和hive中的窗口排序
一、
order by 是要对输出的结果进行全局排序,这就意味着只有一个reduce task时才能实现(多个reducer无法保证全局有序)但是当数据量过大的时候,效率就很低,速度会很慢。可以指定升序asc 降序desc
二、
sort by 不是全局排序,只保证了每个reduce task中数据按照指定字段和排序方式有序排列,是局部排序。排序列必须出现在select column列表中,reduce task 的数量可以通过 set mapred.reduce.tasks=[num] 来设置,当reducer task数量设置为1时,相当于order by排序
三、
distribute by 指的是按照指定的字段进行划分,将数据分到不同的输出reduce task中,通常与sort by一起使用,使用时distribute by必须放在前面。数据通过hash算法分到不同的task中。-----先分组再排序
分组个数由reduce个数决定,分组内有序,但是不能保证分组外有序,可以指定升序还是降序
案例:
select * from 表 distribute by 字段1 sort by 字段2 desc;
Cluster by 除了具有distribute by的功能外,还会对该字段进行排序。当distribute by和sort by 字段相同时,可以使用cluster by 代替
五、窗口排序
row_number() over()
分组排序,并记录名次,一般用来取前n名
row_number() over (partition by cookieid order by pv desc) as rn1
100 99 98 98 97 96
1,2,3,4,5,6
rank() over()
rank() over(partition by cookieid order by pv desc) as rn2
100 99 98 98 97 96
1,2,3,3,5,6
dense_rank() over()
dense_rank() over(partition by cookieid order by pv desc) as rn3
100 99 98 98 97 96
1,2,3,3,4,5