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 配合使用。

转载于:https://www.cnblogs.com/laodageblog/p/4091964.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值