zoukankan      html  css  js  c++  java
  • 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。

  • 相关阅读:
    剑指offer11-二进制中1的个数
    剑指offer10-矩形覆盖
    剑指offer08-跳台阶
    剑指offer07-斐波那契数列
    剑指offer04-重建二叉树
    剑指offer62-二叉搜索树的第k个结点
    kimball维度建模(5)-拉链表原理、设计以及在Hive中的实现
    kimball维度建模(4)-统一数仓层DW与事实表设计
    C-宏定义
    lua-设计与实现-8环境与模块
  • 原文地址:https://www.cnblogs.com/drjava/p/10466468.html
Copyright © 2011-2022 走看看