Hive中的排序语法
ORDER BY
hive中的ORDER BY语句和关系数据库中的sql语法相似。他会对查询结果做全局排序,这意味着所有的数据会传送到一个Reduce任务上,这样会导致在大数量的情况下,花费大量时间。
与数据库中 ORDER BY 的区别在于在hive.mapred.mode = strict
模式下,必须指定 limit 否则执行会报错。
hive> set hive.mapred.mode=strict; hive> select * from test order by id; FAILED: SemanticException 1:28 In strict mode, if ORDER BY is specified, LIMIT must also be specified. Error encountered near token 'id'例子:hive> set hive.mapred.mode=unstrict; hive> select * from test order BY id ; MapReduce Jobs Launched: Job 0: Map: 1 Reduce: 1 Cumulative CPU: 1.88 sec HDFS Read: 305 HDFS Write: 32 SUCCESS Total MapReduce CPU Time Spent: 1 seconds 880 msec OK 1 a 1 a 2 b 2 b 3 c 3 c 4 d 4 d Time taken: 24.609 seconds, Fetched: 8 row(s)
从上面的日志可以看到:启动了一个reduce进行全局排序。
SORT BY
SORT BY不是全局排序,其在数据进入reducer前完成排序,因此在有多个reduce任务情况下,SORT BY只能保证每个reduce的输出有序,而不能保证全局有序。
注意:hive要求DISTRIBUTE BY语句出现在SORT BY语句之前。
你可以通过设置mapred.reduce.tasks
的值来控制reduce的数,然后对reduce输出的结果做二次排序。
例子:
hive> set mapred.reduce.tasks=3; hive> select * from test sort BY id ; MapReduce Jobs Launched: Job 0: Map: 1 Reduce: 3 Cumulative CPU: 4.48 sec HDFS Read: 305 HDFS Write: 32 SUCCESS Total MapReduce CPU Time Spent: 4 seconds 480 msec OK 1 a 2 b 3 c 4 d 2 b 3 c 4 d 1 a Time taken: 29.574 seconds, Fetched: 8 row(s)
从上面的日志可以看到:启动了三个reduce分别排序,最后的结果不是有序的。
DISTRIBUTE BY with SORT BY
DISTRIBUTE BY能够控制map的输出在reduce中如何划分。其可以按照指定的字段对数据进行划分到不同的输出reduce/文件中。
DISTRIBUTE BY和GROUP BY有点类似,DISTRIBUTE BY控制reduce如何处理数据,而SORT BY控制reduce中的数据如何排序。
注意:hive要求DISTRIBUTE BY语句出现在SORT BY语句之前。
例子:
hive> select * from test distribute BY id sort by id asc; Job 0: Map: 1 Reduce: 3 Cumulative CPU: 4.24 sec HDFS Read: 305 HDFS Write: 32 SUCCESS Total MapReduce CPU Time Spent: 4 seconds 240 msec OK 3 c 3 c 1 a 1 a 4 d 4 d 2 b 2 b Time taken: 29.89 seconds, Fetched: 8 row(s)
从上面的日志可以看到:启动了三个reduce分别排序,最后的结果不是有序的。
CLUSTER BY来代替
当DISTRIBUTE BY的字段和SORT BY的字段相同时,可以用CLUSTER BY来代替 DISTRIBUTE BY with SORT BY。
注意:CLUSTER BY不能添加desc或者asc。
例子:
hive> select * from test cluster by id asc; FAILED: ParseException line 1:33 extraneous input 'asc' expecting EOF near '<EOF>'hive> select * from test cluster by id ; MapReduce Jobs Launched: Job 0: Map: 1 Reduce: 3 Cumulative CPU: 4.58 sec HDFS Read: 305 HDFS Write: 32 SUCCESS Total MapReduce CPU Time Spent: 4 seconds 580 msec OK 3 c 3 c 1 a 1 a 4 d 4 d 2 b 2 b Time taken: 30.646 seconds, Fetched: 8 row(s)
从上面的日志可以看到:启动了三个reduce分别排序,最后的结果不是有序的。
怎样让最后的结果是有序的呢?
可以这样做:
hive> select a.* from (select * from test cluster by id ) a order by a.id ; MapReduce Jobs Launched: Job 0: Map: 1 Reduce: 3 Cumulative CPU: 4.5 sec HDFS Read: 305 HDFS Write: 448 SUCCESS Job 1: Map: 1 Reduce: 1 Cumulative CPU: 1.96 sec HDFS Read: 1232 HDFS Write: 32 SUCCESS Total MapReduce CPU Time Spent: 6 seconds 460 msec OK 1 a 1 a 2 b 2 b 3 c 3 c 4 d 4 d Time taken: 118.261 seconds, Fetched: 8 row(s)
总结
- ORDER BY是全局排序,但在数据量大的情况下,花费时间会很长
- SORT BY是将reduce的单个输出进行排序,不能保证全局有序
- DISTRIBUTE BY可以按指定字段将数据划分到不同的reduce中
- 当DISTRIBUTE BY的字段和SORT BY的字段相同时,可以用CLUSTER BY来代替 DISTRIBUTE BY with SORT BY。
转载于:https://www.cnblogs.com/itboys/p/6004333.html
Hive中的排序语法相关推荐
- Hive中的排序:order by/sort by/cluster by
Hive中关于排序的几种方法,有必要深入理解其原理. Order by 全局排序 1)Order By:全局排序,只有一个 Reducer,即使我们在设置set reduceer的数量为多个,但是在执 ...
- 谈笑间学会大数据-Hive中的排序
你可以不够优秀,但是不要甘于平凡.-- 阿尼古 Hive中的四种排序 order by . sort by . distribute by .cluster by 首先贴一下官网对于Hive排序的几种 ...
- hive中的order by、sort by、distribute by、cluster by排序
hive中的排序 说明:hive中有四种全局排序:order by.内部排序:sort by.分区排序:distribute by.组合排序:cluster by. order by(全局排序) 说明 ...
- HIVE中的表以及语法
2019独角兽企业重金招聘Python工程师标准>>> HIVE中的表以及语法 一.HIVE的表 HIVE使用的功能性的表格分为四种:内部表.外部表.分区表.分桶表. 1.内部表.外 ...
- hive 中排序order by,sort by,distribute by使用
前提:hive 中使用的排序有oder by, sort by,distribute By,cluster By 具体使用如下 测试数据: 0: jdbc:hive2://hadoop-03:1000 ...
- Hive中的四种排序方式(order by,sort by,distribute by,cluster by)使用与区别详解
在平时的Hive数仓开发工作中经常会用到排序,而Hive中支持的排序方式有四种,这里结合具体的案例详细介绍一下他们的使用与区别: order by sort by distribute by clus ...
- hive中groupby优化_Hive 查询优化总结
一.join优化 Join查找操作的基本原则:应该将条目少的表/子查询放在Join操作符的左边.原因是在Join操作的Reduce阶段,位于Join操作符左边的表的内容会被加载进内存,将条目少的表放在 ...
- Hive中分组取前N个值
分享两篇文章,结合看更清楚一点. 背景 假设有一个学生各门课的成绩的表单,应用hive取出每科成绩前100名的学生成绩. 这个就是典型在分组取Top N的需求. 解决思路 对于取出每科成绩前100名的 ...
- HIVESQL中ROW_NUMBER() OVER语法以及示例
ROW_NUMBER() OVER函数的基本用法 语法:ROW_NUMBER() OVER(PARTITION BY COLUMNORDER BY COLUMN) 详解: row_number() O ...
最新文章
- 这是2018年的第一场AI生态论坛,比以往来得更早一些
- URAL 1009. K-based Numbers
- android studio ide内部错误,Android Studio内部IDE错误
- [加强版] Codeforces 835D Palindromic characteristics (回文自动机、DP)
- VDI序曲四 个人独享虚拟桌面
- 各层电子数排布规则_干货 | 高中化学电子排布、第一电离能和电负性知识汇总...
- Oracle 最后通牒:要 Java 8 更新先交钱!
- TensorFlow.js 来了!浏览器上线机器学习功能
- Tomcat启动时日志报 dcom.sun.manager.jmxremote 异常导致无法正常启动使用
- C语言学生管理系统(链表实现)
- python编程解数学方程(纯字符串格式)
- 5GNR漫谈12:PRACH随机接入信道(2)
- centos 下 yum安装python3
- 小甜甜布兰妮的饮食瘦身套餐
- 阿里云——媒体云(视频直播)
- 学计算机的桌面,三个软件,干净你的电脑桌面,让你更高效工作学习!
- python中文朗读_Python:语音处理,实现在线朗读RFC文档或本地文本文件
- 利息计算的方式及实现
- Flutter 导航教程
- Cognex Designer中的数据显示-----你不知道的BUG
热门文章
- java io 创建文件夹_Java中Io流操作-File类的常用操作-创建文件,创建文件夹
- 关于我的文章说明及联系方式
- 初识openwrt(上)
- SDL 1.2.14在windows平台下的编译及例子
- linux添加qcc,Alpine Linux添加Let’s Encrypt CA证书或者自签CA证书
- 【Elasticsearch】如何在生产中执行Elasticsearch的零停机升级
- 95-290-360-源码-内存管理-Buffer-ByteBufferPool简介
- spark学习-JavaRDD注册成表然后用SparkSQL查询
- Rabbitmq的三种方式
- 配置监控中心-及管理平台