Hive 的 排序

全排序:order by对全部所有的数据进行排序,在实现的时候是放到一个reduce中进行的,可以想象这样做效率是比较低的;

局部排序:sort by对数据进行分组,然后在组内进行排序,每个reduce分别进行自己的排序;

 

 

row_num()函数:row_num函数通常用over(partition by id),把后面相同id的划分为一组,对这一组内的数据来进行排列;

distribute by:控制着在map端如何分区,按照什么字段进行分区,要注意均衡。在有些情况下,你需要控制某个特定行应该到哪个reducer,通常是为了进行后续的聚集操作。Hive的distribute by 子句可以做这件事。这里就是MR程序员经常做的,设置PARTITION类的过程,此处已经成为一种语法;
 
sort by:每个reduce按照sort by 字段进行排序,reduce的数量按照默认的数量来进行,当然可以指定。最终可以进行归并排序得出结果。适用于数据量比较大的排序场景。在很多情况下,并不需要全局排序,此时可以换成Hive的非标准扩展sort by。Sort by为每个reducer产生一个排序文件;
 
order by:reduce只有一个,在一个reduce中完成排序,使用于数据量小的场景。能够预期产生完全排序的结果,但是它是通过只用一个reduce来做到这点的。所以对于大规模的数据集它的效率非常低;
 
partition by:partition by指定按照字段进行分组,能够和row_num一起使用
 

 例如

  1. // 根据年份和气温对气象数据进行排序,以确保所有具有相同年份的行最终都在一个reducer分区中  
  2.   
  3. From record2  
  4. select year, temperature  
  5. distribute by year  
  6. sort by year asc, temperature desc;  

因此,distribute by 经常和 sort by 配合使用。
posted @ 2014-11-12 13:08  唠叨阁大学士  阅读(422)  评论(0编辑  收藏  举报