zoukankan      html  css  js  c++  java
  • hive中order by,sort by, distribute by, cluster by的用法

    1、order by 

         hive中的order by 和传统sql中的order by 一样,对数据做全局排序,加上排序,会新启动一个job进行排序,会把所有数据放到同一个reduce中进行处理,不管数据多少,不管文件多少,都启用一个reduce进行处理。如果指定了hive.mapred.mode=strict(默认值是nonstrict),这时就必须指定limit来限制输出条数,原因是:所有的数据都会在同一个reducer端进行,数据量大的情况下可能不能出结果,那么在这样的严格模式下,必须指定输出的条数。

      如:原始数据为

     id money name  

    2 15 d

    2 13 b

    4 13 g

    1 14 c

    1 12 a

    3 11 h

    3 14 f

    select id,sum(money) from t group by id 这条语句只用一个job就ok,

    select id,sum(money) from t group by id order by id 如果加上order by 就会多一个job进行排序操作。

    2、sort by 

    sort  by 是局部排序,会在每个reduce端做排序,每个reduce端是排序的,也就是每个reduce出来的数据是有序的,但是全部不一定有序,除非一个reduce,一般情况下可以先进行局部排序完成后,再进行全局排序,会提高不少效率。

    select id,sum(money) from t group by id sort by id;  这条语句也不会增加job,它在reduce端直接进行排序。

    3、distribute by

        distribute by 是控制map端在reduce上是如何区分的,distribute by  会把指定的值发到同一个reduce中,比如 用上面数据distribute by id 它就会把id相同的值放到一个reduce中执行,不是一个值一个reduce,而是相同的值进入到一个reduce,例如用上面数据可以进入到2个reduce,一般情况下可以sort by 结合使用,先进行分组reduce,再进行排序。

    如:select id,money,name from t distribute by id sort by id 

    4、cluster  by

        这个其实就是distribute by 和sort by 结合使用的结果。

       如:select id,money,name from t cluster by id;  

       这条语句其实和select id,money,name from t distribute by id sort by id  这条语句的结果是一样的

  • 相关阅读:
    说谎的简单工厂模式设计模式&工厂方法模式&Abstract Factory模式
    [Gevent]gevent 网络抓取问答
    使用 Capistrano 和写作 Ruby 迭代边缘部署
    【从翻译mos文章】在oracle db 11gR2版本号被启用 Oracle NUMA 支持
    [Unity3D]Unity3D圣骑士模仿游戏开发传仙灵达到当局岛
    [RxJS] Logging a Stream with do()
    [RxJS] Handling a Complete Stream with Reduce
    [RxJS] Completing a Stream with TakeWhile
    [RxJS] Adding Conditional Logic with Filter
    [RxJS] Combining Streams with CombineLatest
  • 原文地址:https://www.cnblogs.com/wujin/p/6024126.html
Copyright © 2011-2022 走看看