• 2.12 Hivet中order by,sort by、distribute by和cluster by


    https://cwiki.apache.org/confluence/display/Hive/LanguageManual+SortBy

    一、order by

    对全局数据的排序,仅仅只有一个reduce;
    
    Hive中的order by跟传统的sql语言中的order by作用是一样的,会对查询的结果做一次全局排序,
    所以说,只有hive的sql中制定了order by所有的数据都会到同一个reducer进行处理(不管有多少map,
    也不管文件有多少的block只会启动一个reducer)。但是对于大量数据这将会消耗很长的时间去执行。
    
    这里跟传统的sql还有一点区别:如果指定了hive.mapred.mode=strict(默认值是nonstrict),这时就必须
    指定limit来限制输出条数,原因是:所有的数据都会在同一个reducer端进行,数据量大的情况下可能
    不能出结果,那么在这样的严格模式下,必须指定输出的条数。
    hive (db_hive)> select * from emp order by empno desc;


    二、sort by

    Hive中指定了sort by,那么在每个reducer端都会做排序,也就是说保证了局部有序(每个reducer出来的数据是有序的,
    但是不能保证所有的数据是有序的,除非只有一个reducer),好处是:执行了局部排序之后可以为接下去的全局排序提高不少的效率
    (其实就是做一次归并排序就可以做到全局排序了)。
    #我们可以设置一下reduce的个数
    hive (db_hive)> set mapreduce.job.reduces= 3;
    hive (db_hive)> set mapreduce.job.reduces;   
    mapreduce.job.reduces=3
    
    #再执行的时候就会有3个reduce结果,在命令行上输出结果时默认合并了,
    hive (db_hive)> select * from emp sort by empno asc;
    
    
    
    #如果用下面语句将结果插入到本地目录,就会看到三个结果集
    insert overwrite local directory'/opt/datas/sortby-res'select * from emp sort by empno asc;
    
    [root@hadoop-senior ~]# ls /opt/datas/sortby-res/
    000000_0  000001_0  000002_0
    
    [root@hadoop-senior ~]# cat /opt/datas/sortby-res/000000_0 
    7654MARTINSALESMAN76981981-9-281250.01400.030
    7698BLAKEMANAGER78391981-5-12850.0N30
    7782CLARKMANAGER78391981-6-92450.0N10
    7788SCOTTANALYST75661987-4-193000.0N20
    7839KINGPRESIDENTN1981-11-175000.0N10
    7844TURNERSALESMAN76981981-9-81500.00.030
    
    [root@hadoop-senior ~]# cat /opt/datas/sortby-res/000001_0 
    7499ALLENSALESMAN76981981-2-201600.0300.030
    7521WARDSALESMAN76981981-2-221250.0500.030
    7566JONESMANAGER78391981-4-22975.0N20
    7876ADAMSCLERK77881987-5-231100.0N20
    7900JAMESCLERK76981981-12-3950.0N30
    7934MILLERCLERK77821982-1-231300.0N10
    
    [root@hadoop-senior ~]# cat /opt/datas/sortby-res/000002_0 
    7369SMITHCLERK79021980-12-17800.0N20
    7902FORDANALYST75661981-12-33000.0N20


    三、distribute by

    类似于MapReduce中分区partition,对数据进行分区,结合sort by进行使用;

    distribute by必须要写在sort by之前,因为distribute by的功能是要先分区,sort by是对分区进行排序的;

    #我这里是对deptno进行分区,然后对empno排序
    hive (db_hive)> insert overwrite local directory '/opt/datas/distby-res' select * from emp distribute by deptno sort by empno asc;
    
    
    #emp表的最后一个字段是deptno,从下面可以看出是按最后一个字段分区的
    [root@hadoop-senior ~]# cat /opt/datas/distby-res/000000_0 
    7499ALLENSALESMAN76981981-2-201600.0300.030
    7521WARDSALESMAN76981981-2-221250.0500.030
    7654MARTINSALESMAN76981981-9-281250.01400.030
    7698BLAKEMANAGER78391981-5-12850.0N30
    7844TURNERSALESMAN76981981-9-81500.00.030
    7900JAMESCLERK76981981-12-3950.0N30
    
    [root@hadoop-senior ~]# cat /opt/datas/distby-res/000001_0 
    7782CLARKMANAGER78391981-6-92450.0N10
    7839KINGPRESIDENTN1981-11-175000.0N10
    7934MILLERCLERK77821982-1-231300.0N10
    
    [root@hadoop-senior ~]# cat /opt/datas/distby-res/000002_0 
    7369SMITHCLERK79021980-12-17800.0N20
    7566JONESMANAGER78391981-4-22975.0N20
    7788SCOTTANALYST75661987-4-193000.0N20
    7876ADAMSCLERK77881987-5-231100.0N20
    7902FORDANALYST75661981-12-33000.0N20


    四、cluster by

    当distribute by和sort by字段相同时,可以使用cluster by;

    cluster by 除了具有 distribute by 的功能外还兼具 sort by 的功能。 所以最终的结果是每个Reduce处理的数据范围不重叠,

    而且每个Reduce内的数据是排序的,而且可以打到全局有序的结果。

    ##
    hive (db_hive)> insert overwrite local directory '/opt/datas/cluster-res' select * from emp  cluster by empno;   
    
    
    
    ##
    [root@hadoop-senior ~]# ls /opt/datas/cluster-res/
    000000_0  000001_0  000002_0
    
    [root@hadoop-senior ~]# cat /opt/datas/cluster-res/000000_0 
    7521WARDSALESMAN76981981-2-221250.0500.030
    7566JONESMANAGER78391981-4-22975.0N20
    7698BLAKEMANAGER78391981-5-12850.0N30
    7782CLARKMANAGER78391981-6-92450.0N10
    7788SCOTTANALYST75661987-4-193000.0N20
    7839KINGPRESIDENTN1981-11-175000.0N10
    7902FORDANALYST75661981-12-33000.0N20
    
    [root@hadoop-senior ~]# cat /opt/datas/cluster-res/000001_0 
    7369SMITHCLERK79021980-12-17800.0N20
    7654MARTINSALESMAN76981981-9-281250.01400.030
    7876ADAMSCLERK77881987-5-231100.0N20
    7900JAMESCLERK76981981-12-3950.0N30
    
    [root@hadoop-senior ~]# cat /opt/datas/cluster-res/000002_0 
    7499ALLENSALESMAN76981981-2-201600.0300.030
    7844TURNERSALESMAN76981981-9-81500.00.030
    7934MILLERCLERK77821982-1-231300.0N10


    五、总结

    OrderBy
    全局排序,一个Reduce
    
    Sort By
    每个reduce内部进行排序,全局不是排序
    
    Distribute By
    类似MR中partition,进行分区,结合sort by使用
    
    Cluster By
    当distribute和sort字段相同时,使用方式
  • 相关阅读:
    结构体排序
    字符串转下标
    格式控制1
    Prime
    n阶导函数存在与n阶可导的区别
    winrar
    android 上传文件(表单),表单填写格式分析
    android form表单上传文件
    Android排错:has leaked window com.android.internal.policy.impl.PhoneWindow$ that was originally added here
    android 软键盘Enter键图标的设置 android:imeOptions
  • 原文地址:https://www.cnblogs.com/weiyiming007/p/10761404.html
Copyright © 2020-2023  润新知