hive的 order by & distribute by & cluter by

Posted drjava

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hive的 order by & distribute by & cluter by相关的知识,希望对你有一定的参考价值。

我们应该都清楚order by 的含义:

根据某个字段对输出的数据排序,因为只有一个reducer,所以查询效率较慢。

 

那么hive中,另外两个排序,distribute by和cluster by的含义是什么呢?

  • distribute by 分区排序

直接上例子,hive中有张工资表:salary,字段是部门id--department_id,姓名--name,薪水--salary

department_id

name salary
1 张三 3500
2 李一 2800
1 王五 5000
2 赵六 6000

我们想要按部门分区,再按部门中员工工资由高到低排序:

select * from salary distribute by department_id sort by salary;

department_id

name salary
1 张三 3500
1 王五 5000
2 李一 2800
2 赵六 6000

可以看到结果按部门做了分区,每个部门数据按薪水做了排序。

观察数据的话,每个文件中存储了相同分区的数据。

因为每个分区使用一个reducer,所以设置的reducer个数应该大于等于结果的分区数,

不然会报错。

 

补充:

设置reducer个数的方法:

set mapreduce.job.reduces=-1;

设为默认值,系统分配reduce的个数。

设置好后检查一下:

set mapreduce.job.reduces;

技术图片

(如果reducer的个数大于分区数会产生空文件,reducer的个数小于分区数则会报错)

说明:

  1. 类似于mr中的分区,要用多个reducer处理,最终输出多个文件结果
  2. 当分区字段和排序字段不同的时候使用,需和sort by结合
  • cluster by

当ditribute by ...sort by的字段是同一个字段时,可以用cluster by 代替。

但是cluster by的排序只支持倒序,不能指定asc或desc。

 

以上是关于hive的 order by & distribute by & cluter by的主要内容,如果未能解决你的问题,请参考以下文章

Hive中的Order by与关系型数据库中的order by语句的异同点

Hive Order By操作

Hive之cluster by , distribute by,order by,sort by

hive中order by,sort by, distribute by, cluster by的用法

使用 order by 时出现 Hive 错误

hive中order by,sort by, distribute by, cluster by作用以及用法