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。

  • 相关阅读:
    一道网易面试题
    OC的引用计数
    ReplayKit2 采集音视频回调格式分析
    《剑指offer3- 从末尾到头打印链表》
    《剑指offer
    《剑指offer
    ReplayKit2:声音回调时间戳问题
    UILable在Autolayout模式下面自动调节字体大小
    建表手写语句
    oracle创建主键序列和在ibatis中应用
  • 原文地址:https://www.cnblogs.com/drjava/p/10466468.html
Copyright © 2011-2022 走看看