HIVE中,order by、sort by、 distribute by和 cluster by区别,以及cluster by有什么意义

7 篇文章 0 订阅

1. oreder by

      主要是做全局排序。
      只要hive的sql中指定了order by,那么所有的数据都会到同一个reducer进行处理(不管有多少map,也不管文件有多少的block,只会启动一个reducer )。但是对于大量数据这将会消耗很长的时间去执行。
      这里跟传统的sql还有一点区别:如果指定了hive.mapred.mode=strict(默认值是nonstrict),这时就必须指定limit来限制输出条数。因为:所有的数据都会在同一个reducer端进行,数据量大的情况下可能不能出结果,那么在这样的严格模式下,必须指定输出的条数。

2. sort by

      每个reduce端都会进行排序,也就是局部有序,可以指定多个reduce。同时,如果想测试一下执行的效果,建议将输出结果保存到本地,并调整reduce的数量。(我设置成3个)

      将查询结果保存到本地:

insert overwrite 
local directory '/home/data'
select * from stu sort by gradedesc;

      调整reduce的数量:

set mapreduce.job.reduce=3;

      查看reduce的数量:

set mapreduce.job.reduce;

      但是,使用sort by的情况下,分区是随机分的。

3. distribute by

      指定分区原则。通常和sort by一起用,distribute by必须要写在sort by之前。理解成:按照XX字段分区,再按照XX字段排序
      举个例子:

      只按照grade字段排序,但是不指定分区字段:

select * from stu sort by grade;

      先按照class分区,再按照grade排序:

select * from stu distribute by class sort by grade;

4. cluster by

      当distribute by 和 sort by 所指定的字段相同时,即可以使用cluster by。
      注意:cluster by指定的列只能是降序,不能指定asc和desc。

      举个例子:

select * from stu distribute by class sort by class

      等价于:

select * from stu cluster by class

---------------------------------------------分割线-----------------------------------
      再举个例子:

select * from stu distribute by class sort by class,name

      等价于

select * from stud distribute cluster by class sort by name

      注意被cluster by指定的列只能是降序,不能指定asc和desc。

5. cluster by有什么意义?

      具体请查看:HIVE中,cluster by有什么意义

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值