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

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有什么意义

发布了48 篇原创文章 · 获赞 36 · 访问量 13万+

猜你喜欢

转载自blog.csdn.net/weixin_42845682/article/details/104953351