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.0\N30
7782CLARKMANAGER78391981-6-92450.0\N10
7788SCOTTANALYST75661987-4-193000.0\N20
7839KINGPRESIDENT\N1981-11-175000.0\N10
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.0\N20
7876ADAMSCLERK77881987-5-231100.0\N20
7900JAMESCLERK76981981-12-3950.0\N30
7934MILLERCLERK77821982-1-231300.0\N10 [root@hadoop-senior ~]# cat /opt/datas/sortby-res/000002_0
7369SMITHCLERK79021980-12-17800.0\N20
7902FORDANALYST75661981-12-33000.0\N20

三、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.0\N30
7844TURNERSALESMAN76981981-9-81500.00.030
7900JAMESCLERK76981981-12-3950.0\N30 [root@hadoop-senior ~]# cat /opt/datas/distby-res/000001_0
7782CLARKMANAGER78391981-6-92450.0\N10
7839KINGPRESIDENT\N1981-11-175000.0\N10
7934MILLERCLERK77821982-1-231300.0\N10 [root@hadoop-senior ~]# cat /opt/datas/distby-res/000002_0
7369SMITHCLERK79021980-12-17800.0\N20
7566JONESMANAGER78391981-4-22975.0\N20
7788SCOTTANALYST75661987-4-193000.0\N20
7876ADAMSCLERK77881987-5-231100.0\N20
7902FORDANALYST75661981-12-33000.0\N20

四、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.0\N20
7698BLAKEMANAGER78391981-5-12850.0\N30
7782CLARKMANAGER78391981-6-92450.0\N10
7788SCOTTANALYST75661987-4-193000.0\N20
7839KINGPRESIDENT\N1981-11-175000.0\N10
7902FORDANALYST75661981-12-33000.0\N20 [root@hadoop-senior ~]# cat /opt/datas/cluster-res/000001_0
7369SMITHCLERK79021980-12-17800.0\N20
7654MARTINSALESMAN76981981-9-281250.01400.030
7876ADAMSCLERK77881987-5-231100.0\N20
7900JAMESCLERK76981981-12-3950.0\N30 [root@hadoop-senior ~]# cat /opt/datas/cluster-res/000002_0
7499ALLENSALESMAN76981981-2-201600.0300.030
7844TURNERSALESMAN76981981-9-81500.00.030
7934MILLERCLERK77821982-1-231300.0\N10

五、总结

OrderBy
全局排序,一个Reduce Sort By
每个reduce内部进行排序,全局不是排序 Distribute By
类似MR中partition,进行分区,结合sort by使用 Cluster By
当distribute和sort字段相同时,使用方式

2.12 Hivet中order by,sort by、distribute by和cluster by的更多相关文章

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

    1.order by hive中的order by 和传统sql中的order by 一样,对数据做全局排序,加上排序,会新启动一个job进行排序,会把所有数据放到同一个reduce中进行处理,不管数 ...

  2. hive中order by ,sort by ,distribute by, cluster by 的区别(**很详细**)

    hive 查询语法 select [all | distinct] select_ condition, select_ condition from table_name a [join table ...

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

    1. order by     Hive中的order by跟传统的sql语言中的order by作用是一样的,会对查询的结果做一次全局排序,所以说,只有hive的sql中制定了order by所有的 ...

  4. Hadoop Hive 中的排序 Order by ,Sort by ,Distribute by以及 Cluster By

    order by order by 会对输入做全局排序,因此只有一个reducer(多个reducer无法保证全局有序)只有一个reducer,会导致当输入规模较大时,需要较长的计算时间. set h ...

  5. [转载]hive中order by,sort by, distribute by, cluster by作用以及用法

    1. order by     Hive中的order by跟传统的sql语言中的order by作用是一样的,会对查询的结果做一次全局排序,所以说,只有hive的sql中制定了order by所有的 ...

  6. Hive 中的 order by, sort by, distribute by 与 cluster by

    Order By order by 会对输入做全排序, 因此只有一个Reducer(多个Reducer无法保证全局有序), 然而只有一个Reducer, 会导致当输入规模较大时, 消耗较长的计算时间. ...

  7. hive 中 Order by, Sort by ,Dristribute by,Cluster By 的作用和用法

    order by order by 会对输入做全局排序,因此只有一个reducer(多个reducer无法保证全局有序) 只有一个reducer,会导致当输入规模较大时,需要较长的计算时间. set ...

  8. [大数据相关] Hive中的全排序:order by,sort by, distribute by

    写mapreduce程序时,如果reduce个数>1,想要实现全排序需要控制好map的输出,详见Hadoop简单实现全排序. 现在学了hive,写sql大家都很熟悉,如果一个order by解决 ...

  9. hive 排序 order by sort by distribute by cluster by

    order by:     order by是全局排序,受hive.mapred.mode的影响.       使用orderby有一些限制:     1.在严格模式下(hive.mapred.mod ...

随机推荐

  1. 微信热补丁 Tinker 的实践演进之路

    http://dev.qq.com/topic/57ad7a70eaed47bb2699e68e http://dev.qq.com/topic/57a30878ac3a1fb613dd40eb ht ...

  2. java模拟而一个电话本操作

    哈哈.大家平时都在使用电话本.以下使用java来模拟而一个简单的电话本吧... 首先给出联系人的抽象类 package net.itaem.po; /** * * 电话人的信息 * */ public ...

  3. Finder 快捷键

    记录几个常用的 Finder 快捷键: 复制 Finder 里选中的路径:option+cmd+c 地址栏跳到指定路径:shift+cmd+g 增加标签:cmd+t 显示/隐藏 标签栏:shift+c ...

  4. linux 块设备驱动(二)——块设备数据结构

    本文来源于: 1. http://www.cnblogs.com/dyllove98/archive/2013/07/01/3165567.html 块设备相关的数据结构以及接口: 块设备接口则相对复 ...

  5. Asp.net core 初探

    写这篇博客的主要目的是加深自己的印象. 后续每天都会写一些自己的学习心得. Ubuntu :16.04 桌面版 .net core : dotnet-dev-1.0.0-preview2-003121 ...

  6. linux cat命令(转载)

    来源:http://blog.sina.com.cn/s/blog_52f6ead0010127xm.html 1.cat 显示文件连接文件内容的工具: cat 是一个文本文件查看和连接工具. 查看一 ...

  7. 互联网时代的精准招聘-Uber新手游有感

    找工作难.招人也难.漫天的简历,全是求职者广撒网式的复制粘贴,如何找到合适的人.会认真对待职位的人?或许你须要换换思路,看看Uber新出的手机游戏能够咱啥启发. Uber在过去5年已经蹭蹭成长为估值5 ...

  8. Java类加载器(死磕3)

    [正文]Java类加载器(  CLassLoader ) 死磕3:  揭秘 ClassLoader抽象基类 本小节目录 3.1. 类的加载分类:隐式加载和显示加载 3.2. 加载一个类的五步工作 3. ...

  9. Ubuntu搜狗输入法候选词乱码

    打开Fcitx Configuration,进入Addon标签 选中Simplified Chinese To Traditional Chinese       Convert Simplified ...

  10. mongodb学习之:主从复制

    在sql server能够做到读写分离,双机热备份和集群部署,这些在mongodb也能做到.首先来看主从复制.我们就在一台电脑上进行操作 第一步:分别建立master和slave两个文件夹 第二步:开 ...