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. 项目部署到niginx title乱码问题

    今天部署我react移动端项目到我的linux服务器的时候出现乱码问题 原来是我再配置niginxserver的时候没有指定charset,设置为utf-8,重启nginx服务器,大功告成

  2. Java ClassLoader详解(转载)

    Java ClassLoader详解 类加载器是 Java 语言的一个创新,也是 Java 语言流行的重要原因之一.它使得 Java 类可以被动态加载到 Java 虚拟机中并执行.类加载器从 JDK ...

  3. 优化梯度计算的改进的HS光流算法

    前言 在经典HS光流算法中,图像中两点间的灰度变化被假定为线性的,但实际上灰度变化是非线性的.本文详细分析了灰度估计不准确造成的偏差并提出了一种改进HS光流算法,这种算法可以得到较好的计算结果,并能明 ...

  4. Android 一键清理动画

    版本号:1.0  日期:2014.7.29 2014.7.30 版权:© 2014 kince 转载注明出处   一键清理是非常多Launcher都会带有的功能,其效果也比較美观.实现方式或许有非常多 ...

  5. 【BZOJ3837】[Pa2013]Filary 随机化神题

    [BZOJ3837][Pa2013]Filary Description 给定n个正整数,从中挑出k个数,满足:存在某一个m(m>=2),使得这k个数模m的余数相等. 求出k的最大值,并求出此时 ...

  6. Hibernate中的HQL语言

    一.HQL语言简介 HQL全称是Hibernate Query Language,它提供了是十分强大的功能,它是针对持久化对象,直接取得对象,而不进行update,delete和insert等操作.而 ...

  7. iOS应用的入口自定义和事件处理的自定义

    iOS应用的入口自定义和事件处理的自定义 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions: ...

  8. 动态区间第K大

    整体二分. 主要需要注意的一点是,对于每个删除操作,若删除操作被算入贡献,则最开始的插入操作也一定会被算入,所以不必担心删除删错. #include<cstdio> #include< ...

  9. 如何在时间复杂度为O(n)空间复杂度为O(1)的情况下完成链表的逆置

    问题如题目,首先分析,链表的反转的空间复杂度如果为常数级,那么不可能完成从堆中申请数据来完成链表的反转工作,所以问题就转化为了如何将原链表修改/拆解为逆置的链表: 函数形式假定如下  void Inv ...

  10. LightOJ1341 Aladdin and the Flying Carpet —— 唯一分解定理

    题目链接:https://vjudge.net/problem/LightOJ-1341 1341 - Aladdin and the Flying Carpet    PDF (English) S ...