Hive基础之排序
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基础之排序的更多相关文章
- 《Programming Hive》读书笔记(两)Hive基础知识
<Programming Hive>读书笔记(两)Hive基础知识 :第一遍读是浏览.建立知识索引,由于有些知识不一定能用到,知道就好.感兴趣的部分能够多研究. 以后用的时候再具体看.并结 ...
- [转帖]Hive基础(一)
Hive基础(一) 2018-12-19 15:35:03 人间怪物 阅读数 234 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接 ...
- 【Hive】Hive 基础
Hive架构: Hive基础 1 概念 1.1 简介 1.1.1 hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表, 并提供简单的sql查询功能,可以将sql语句 ...
- Hive基础(1)
Hive基础(1) Hive的HQL(2) 1. Hive并不是分布式的,它独立于机器之外,类似于Hadoop的客户端. 2. 元数据和数据的区别,前者如表名.列名.字段名等. 3. Hive的三种安 ...
- 算法与数据结构基础 - 拓扑排序(Topological Sort)
拓扑排序基础 拓扑排序用于解决有向无环图(DAG,Directed Acyclic Graph)按依赖关系排线性序列问题,直白地说解决这样的问题:有一组数据,其中一些数据依赖其他,问能否按依赖关系排序 ...
- 算法基础~链表~排序链表的合并(k条)
算法基础~链表~排序链表的合并(k条) 1,题意:已知k个已排序链表头结点指针,将这k个链表合并,合并后仍然为有序的,返回合并后的头结点. 2,方法之间时间复杂度的比较: 方法1(借助工具vector ...
- 【转】Hive 基础之:分区、桶、Sort Merge Bucket Join
Hive 已是目前业界最为通用.廉价的构建大数据时代数据仓库的解决方案了,虽然也有 Impala 等后起之秀,但目前从功能.稳定性等方面来说,Hive 的地位尚不可撼动. 其实这篇博文主要是想聊聊 S ...
- Hive基础讲解
一.Hive背景介绍 Hive最初是Facebook为了满足对海量社交网络数据的管理和机器学习的需求而产生和发展的.马云在退休的时候说互联网现在进入了大数据时代,大数据是现在互联网的趋势,而had ...
- Hive中的排序和分组(对map和reduce的影响,值得一看!)
order by order by 会对输入做全局排序,因此只有一个reducer(多个reducer无法保证全局有序)只有一个reducer,会导致当输入规 模较大时,需要较长的计算时间. set ...
随机推荐
- IOS 获取中英文字符串长度
//得到中英文混合字符串长度 方法1 - (int)convertToInt:(NSString*)strtemp { int strlength = 0; char* p = (char*)[str ...
- MATLAB安装教程
1.资源下载 下载官方安装包R2015b_win64.(文件太大,没上传资源) 下载破解文件包,解压其中的相应压缩包(一般是win64那个压缩包) 下载地址:链接:http://pan.baidu.c ...
- Mac下百度网盘破解
Mac版百度网盘破解 先下载正版的百度网盘 打开终端输入命令 cd ~/Downloads && git clone https://github.com/CodeTips/Baid ...
- LG2731 骑马修栅栏 Riding the Fences
题意 John是一个与其他农民一样懒的人.他讨厌骑马,因此从来不两次经过一个栅栏.你必须编一个程序,读入栅栏网络的描述,并计算出一条修栅栏的路径,使每个栅栏都恰好被经过一次.John能从任何一个顶点( ...
- JS前端数据多条件筛选(商品搜索)
有时候也会需要在前端进行数据筛选,增强交互体验.当数据可用的筛选条件较多时,把逻辑写死会给后期维护带来很大麻烦.下面是我自己写的一个简单的筛选器,筛选条件可以根据数据包含的字段动态设置. 仿照京东的筛 ...
- 将一个list转成json数组-晚上坐49路回去打卡
- 感悟:Java新手一点想法
在2年前写的博客,写的那么幼稚,工作了,工作经验多重要啊,有3年的开发经验,工资8000-12000 没接触Java框架之前,以为这些东西多神秘,多了不起,多高大上,其实也就那样 最重要的搞懂交互的流 ...
- 转 Apache Kafka:下一代分布式消息系统
简介 Apache Kafka是分布式发布-订阅消息系统.它最初由LinkedIn公司开发,之后成为Apache项目的一部分.Kafka是一种快速.可扩展的.设计内在就是分布式的,分区的和可复制的提交 ...
- C语言屏幕打印,再删除打印的内容
在做项目的时候,用到了命令行模式进行监听数据,并且是多线程的.因为程序大部分时间都只是在监听状态,容易给人假死的信息.所以单独使用一个进行在屏幕上打印省略号(.......),然后再把打印的省略号(. ...
- QString 和char数组转换(转)
在qt开发过程中经常遇到QString类和char数组进行转换,在此记录一下: QString->char数组 1 2 3 QString str="12fff"; QByt ...