小记--------hive 4大排序案例
1.order by order by和其他sql一样对查询结果集执行一个全局排序,也就是说会有一个所有的数据都通过一个reducer进行处理的过程会消耗大量时间来执行
Ex: select * from renter_info order by create_time desc ;
2.sort by 其只会对每个reducer中对数据进行排序,也就是执行一个局部排序过程。可以保证每个reducer的输出数据都是有序的(但不是全局有序),这样可以提供后面进行的全局排序的效率
Ex: select * from renter_info sort by create_time desc;
上面两个查询看上去几乎一样,不过如果使用的reducer的个数大于1的话,那么输出结果的排序就不一样了。
3.distribute by distribute by是控制map的输出在reducer中如何划分的。默认情况下,MapReduce计算框架会一句map输入的键计算相应的哈希值,然后按照得到的哈希值将键-值对均匀分发到多个reducer中去。
ex: 假设我们将具有相同班级的数据一起处理,使用distribute by 将相同班级的数据分发到同一个reducer中,然后使用sort by对每个班级的同学进行排序。
select class_id, student_id, score from className distribute by class_id sort by score desc;
distribute by和group by在其控制着reducer是如何接受一行行数据进行处理方面是类型的。
注意:hive要求distribute by语句要写在sort by语句之前。
4.cluster by :如果distribute by和sort by中使用的列完全一致(数量、列名),并且采用的是升序排序方式,那么cluster by 就等价于前面的2个语句,相当于是前面2个句子的一个简写方式。
ex:select * from tableName cluster by Id;
注意:使用 distribute by …sort by或者 cluster by 会剥夺sort by 的并行性。但是这样可以实现输出文件的数据是全局排序的。
作者:于二黑
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。