order by

1、order by会对输入按照指定字段做全局排序,输出结果有序,因此只有一个reducer(多个reducer无法保证全局排序,手工设定reduce数量无效);

  只有一个reducer会导致当输入规模较大时,需要较长的计算时间,速度很非常慢;在数据量大的情况下慎用order by;

2、hive.mapred.mode(默认值是nonstrict)对order by的影响

  1)当hive.mapred.mode=nonstrict时,order by和关系型数据库中的order by功能一致,按照指定的某一列或多列排序输出;

  2)当hive.mapred.mode=strict时,order by必须要使用limit,否则执行会报错;

set hive.mapred.mode=strict;
select * from emp order by empno desc;

FAILED: SemanticException 1:27 In strict mode, if ORDER BY is specified, LIMIT must also be specified. Error encountered near token 'empno'

  3)当hive.mapred.mode=strict时,分区表必须要指定partition进行查询,否则执行会报错;

FAILED: SemanticException [Error 10041]: No partition predicate found for Alias "xxx" Table "xxxx";

3、select * from emp where empno > 7782 order by empno desc;的执行过程

从表中读取数据,执行where条件,然后以empno的值做为key,其他列值做为value,然后把数据传到同一个reduce中,根据需要的排序方式进行排序;

注意:where是在map阶段执行的,而非reduce阶段执行。

sort by

1、使用sort by可以指定reduce的个数:set mapred.reduce.tasks=10; 对输出的数据在进行归并排序即可得到全部结果;

2、sort by非分区表不受hive.mapred.mode是否是strict还是nostrict的影响(不需要强制使用limit限制);如果是分区表,必须指定partition字段;

3、sort by的数据只能保证在同一个reduce中的数据可以按照指定字段排序;

4、可以用limit子句大大减少数据量。使用limit n后,传输到reduce端的数据记录数就减少到n* (map个数);

set mapred.reduce.tasks = 3;
select * from emp sort by empno;
7654    MARTIN  SALESMAN        7698    1981-9-28       1250.0  1400.0  30
7698 BLAKE MANAGER 7839 1981-5-1 2850.0 NULL 30
7782 CLARK MANAGER 7839 1981-6-9 2450.0 NULL 10
7788 SCOTT ANALYST 7566 1987-4-19 3000.0 NULL 20
7839 KING PRESIDENT NULL 1981-11-17 5000.0 NULL 10
7844 TURNER SALESMAN 7698 1981-9-8 1500.0 0.0 30
7499 ALLEN SALESMAN 7698 1981-2-20 1600.0 300.0 30
7521 WARD SALESMAN 7698 1981-2-22 1250.0 500.0 30
7566 JONES MANAGER 7839 1981-4-2 2975.0 NULL 20
7876 ADAMS CLERK 7788 1987-5-23 1100.0 NULL 20
7900 JAMES CLERK 7698 1981-12-3 950.0 NULL 30
7934 MILLER CLERK 7782 1982-1-23 1300.0 NULL 10
7369 SMITH CLERK 7902 1980-12-17 800.0 NULL 20
7902 FORD ANALYST 7566 1981-12-3 3000.0 NULL 20

把上面的结果写到文件中再观察:每个文件中都是按照empno的升序排列的

set mapred.reduce.tasks = 3;
insert overwrite local directory '/home/spark/data' select * from emp sort by empno; cd /home/spark/data
ls
000000_0
000001_0
000002_0
more 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
more 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
more 000002_0
7369SMITHCLERK79021980-12-17800.0\N20
7902FORDANALYST75661981-12-33000.0\N20

可见每个reduce内部的数据是经过排序的。

distribute by

1、按照指定的字段把数据分散到不同的reduce文件中(可以指定map到reduce端分发的key,这样可以充分利用hadoop资源,在多个reduce中局部按需要排序的字段进行排序);可以设定reduce个数;

set mapred.reduce.tasks = 3;
insert overwrite local directory '/home/spark/data' select * from emp distribute by length(ename) sort by empno; cd /home/spark/data
ls
000000_0
000001_0
000002_0
more 000000_0
7654MARTINSALESMAN76981981-9-281250.01400.030
7844TURNERSALESMAN76981981-9-81500.00.030
7934MILLERCLERK77821982-1-231300.0\N10
more 000001_0
7521WARDSALESMAN76981981-2-221250.0500.030
7839KINGPRESIDENT\N1981-11-175000.0\N10
7902FORDANALYST75661981-12-33000.0\N20
more 000002_0
7369SMITHCLERK79021980-12-17800.0\N20
7499ALLENSALESMAN76981981-2-201600.0300.030
7566JONESMANAGER78391981-4-22975.0\N20
7698BLAKEMANAGER78391981-5-12850.0\N30
7782CLARKMANAGER78391981-6-92450.0\N10
7788SCOTTANALYST75661987-4-193000.0\N20
7876ADAMSCLERK77881987-5-231100.0\N20
7900JAMESCLERK76981981-12-3950.0\N30

length是内建函数,也可以指定其他的函数或者使用UDF;

2、distribute by与sort by连用:按照ename指定到reduce,每个reduce中按照ename升序排列;

set mapred.reduce.tasks = 3;
insert overwrite local directory '/home/spark/data' select * from emp distribute by ename sort by ename; cd /home/spark/data
ls
000000_0
000001_0
000002_0
more 000000_0
7698BLAKEMANAGER78391981-5-12850.0\N30
7839KINGPRESIDENT\N1981-11-175000.0\N10
more 000001_0
7876ADAMSCLERK77881987-5-231100.0\N20
7499ALLENSALESMAN76981981-2-201600.0300.030
7654MARTINSALESMAN76981981-9-281250.01400.030
7934MILLERCLERK77821982-1-231300.0\N10
7788SCOTTANALYST75661987-4-193000.0\N20
7844TURNERSALESMAN76981981-9-81500.00.030
more 000002_0
7782CLARKMANAGER78391981-6-92450.0\N10
7902FORDANALYST75661981-12-33000.0\N20
7900JAMESCLERK76981981-12-3950.0\N30
7566JONESMANAGER78391981-4-22975.0\N20
7369SMITHCLERK79021980-12-17800.0\N20
7521WARDSALESMAN76981981-2-221250.0500.030

3、如果sort by只有一个reduce时,和order by输出结果一致;

4、select * from emp where empno>7782 distribute by ename sort by ename;执行过程

从表中读取数据,执行where条件;以distribute by列的值做为key,其他列值做为value,然后把数据根据key值传到不同的reduce,然后按照sort by字段进行排序;

cluster by

1、cluster by除了具有distribute by的功能外还兼备sort by功能;

2、当distribute by col1与sort by col1连用,且跟随的字段相同时,可使用cluster by简写;

select * from emp  cluster by ename; 

Hive排序总结

1、在hive中进行字段排序统计过程中,使用ORDER BY是全局排序,hive只能通过一个reduce进行排序,效率很低;

2、sort by实现部分排序,单个reduce输出的结果是有序的、效率高,通常与distribute by关键字一起使用,distribute by关键字可以指定map到reduce端的分发key, 这样可以充分利用hadoop资源, 在多个reduce中局部按需要排序的字段进行排序;

3、cluster by col1等同于distributed by col1与sort by col1组合。

Hive基础之排序的更多相关文章

  1. 《Programming Hive》读书笔记(两)Hive基础知识

    <Programming Hive>读书笔记(两)Hive基础知识 :第一遍读是浏览.建立知识索引,由于有些知识不一定能用到,知道就好.感兴趣的部分能够多研究. 以后用的时候再具体看.并结 ...

  2. [转帖]Hive基础(一)

    Hive基础(一) 2018-12-19 15:35:03 人间怪物 阅读数 234   版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接 ...

  3. 【Hive】Hive 基础

    Hive架构: Hive基础 1 概念 1.1 简介 1.1.1 hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表, 并提供简单的sql查询功能,可以将sql语句 ...

  4. Hive基础(1)

    Hive基础(1) Hive的HQL(2) 1. Hive并不是分布式的,它独立于机器之外,类似于Hadoop的客户端. 2. 元数据和数据的区别,前者如表名.列名.字段名等. 3. Hive的三种安 ...

  5. 算法与数据结构基础 - 拓扑排序(Topological Sort)

    拓扑排序基础 拓扑排序用于解决有向无环图(DAG,Directed Acyclic Graph)按依赖关系排线性序列问题,直白地说解决这样的问题:有一组数据,其中一些数据依赖其他,问能否按依赖关系排序 ...

  6. 算法基础~链表~排序链表的合并(k条)

    算法基础~链表~排序链表的合并(k条) 1,题意:已知k个已排序链表头结点指针,将这k个链表合并,合并后仍然为有序的,返回合并后的头结点. 2,方法之间时间复杂度的比较: 方法1(借助工具vector ...

  7. 【转】Hive 基础之:分区、桶、Sort Merge Bucket Join

    Hive 已是目前业界最为通用.廉价的构建大数据时代数据仓库的解决方案了,虽然也有 Impala 等后起之秀,但目前从功能.稳定性等方面来说,Hive 的地位尚不可撼动. 其实这篇博文主要是想聊聊 S ...

  8. Hive基础讲解

      一.Hive背景介绍 Hive最初是Facebook为了满足对海量社交网络数据的管理和机器学习的需求而产生和发展的.马云在退休的时候说互联网现在进入了大数据时代,大数据是现在互联网的趋势,而had ...

  9. Hive中的排序和分组(对map和reduce的影响,值得一看!)

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

随机推荐

  1. Robust Tracking via Weakly Supervised Ranking SVM

    参考文献:Yancheng Bai and Ming Tang. Robust Tracking via Weakly Supervised Ranking SVM Abstract 通常的算法:ut ...

  2. 【机器学习算法】cascade classifier级联分类器

    前言 参考 1.级联分类器: 完

  3. 强大的dfs(用处1——拓扑排序【xdoj1025】,用处二——求强联通分量【ccf高速公路】)当然dfs用处多着咧

    xdoj 1025 亮亮最近在玩一款叫做“梦想庄园”的经营游戏.在游戏中,你可以耕种,养羊甚至建造纺织厂. 如果你需要制造衣服,你首先得有布匹和毛线.布匹由棉花纺织而成:毛线由羊毛制成,而羊需要饲料才 ...

  4. bool dfs 解决单一解问题的优越性

    dfs的返回值类型可以是int 或者 void  .bool 由void 与 int 作为返回值类型的dfs在得到解之后不能立即返回,即使你加上语句if(key)return;也要在得到解之后一点点返 ...

  5. ubuntu安装sublime教程

    1.安装Sublime Text 3 及常用的神器插件 ①首先添加sublime text 3的仓库:sudo add-apt-repository ppa:webupd8team/sublime-t ...

  6. day34 python学习 守护进程,线程,互斥锁,信号量,生产者消费者模型,

    六 守护线程 无论是进程还是线程,都遵循:守护xxx会等待主xxx运行完毕后被销毁 需要强调的是:运行完毕并非终止运行 #1.对主进程来说,运行完毕指的是主进程代码运行完毕 #2.对主线程来说,运行完 ...

  7. FastAdmin composer json 版本说明

    来源于 FastAdmin 执行 composer update 后将 ThinkPHP 升级到了 V5.1. FastAdmin  是基于 ThinkPHP 5.0.x 开发的,而 ThinkPHP ...

  8. Spring boot 使用的注解有哪些?

    Spring boot 使用的注解有哪些? 注解 作用 @SpringBootApplication 等价于 @Configuration + @EnableAutoConfiguration + @ ...

  9. PHP 短连接生成算法

    短连接生成类: <?php #短连接生成算法 class Short_Url { #字符表 public static $charset = "0123456789ABCDEFGHIJ ...

  10. 机器学习Hands On Lab

    fetch_data fetch_mldata默认路径是在scikit_learn_data路径下,mnist的mat文件其实直接放置到scikit_lean/mldata下面即可通过fetch_ml ...