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中的排序语法相关推荐

  1. Hive中的排序:order by/sort by/cluster by

    Hive中关于排序的几种方法,有必要深入理解其原理. Order by 全局排序 1)Order By:全局排序,只有一个 Reducer,即使我们在设置set reduceer的数量为多个,但是在执 ...

  2. 谈笑间学会大数据-Hive中的排序

    你可以不够优秀,但是不要甘于平凡.-- 阿尼古 Hive中的四种排序 order by . sort by . distribute by .cluster by 首先贴一下官网对于Hive排序的几种 ...

  3. hive中的order by、sort by、distribute by、cluster by排序

    hive中的排序 说明:hive中有四种全局排序:order by.内部排序:sort by.分区排序:distribute by.组合排序:cluster by. order by(全局排序) 说明 ...

  4. HIVE中的表以及语法

    2019独角兽企业重金招聘Python工程师标准>>> HIVE中的表以及语法 一.HIVE的表 HIVE使用的功能性的表格分为四种:内部表.外部表.分区表.分桶表. 1.内部表.外 ...

  5. hive 中排序order by,sort by,distribute by使用

    前提:hive 中使用的排序有oder by, sort by,distribute By,cluster By 具体使用如下 测试数据: 0: jdbc:hive2://hadoop-03:1000 ...

  6. Hive中的四种排序方式(order by,sort by,distribute by,cluster by)使用与区别详解

    在平时的Hive数仓开发工作中经常会用到排序,而Hive中支持的排序方式有四种,这里结合具体的案例详细介绍一下他们的使用与区别: order by sort by distribute by clus ...

  7. hive中groupby优化_Hive 查询优化总结

    一.join优化 Join查找操作的基本原则:应该将条目少的表/子查询放在Join操作符的左边.原因是在Join操作的Reduce阶段,位于Join操作符左边的表的内容会被加载进内存,将条目少的表放在 ...

  8. Hive中分组取前N个值

    分享两篇文章,结合看更清楚一点. 背景 假设有一个学生各门课的成绩的表单,应用hive取出每科成绩前100名的学生成绩. 这个就是典型在分组取Top N的需求. 解决思路 对于取出每科成绩前100名的 ...

  9. HIVESQL中ROW_NUMBER() OVER语法以及示例

    ROW_NUMBER() OVER函数的基本用法 语法:ROW_NUMBER() OVER(PARTITION BY COLUMNORDER BY COLUMN) 详解: row_number() O ...

最新文章

  1. 这是2018年的第一场AI生态论坛,比以往来得更早一些
  2. URAL 1009. K-based Numbers
  3. android studio ide内部错误,Android Studio内部IDE错误
  4. [加强版] Codeforces 835D Palindromic characteristics (回文自动机、DP)
  5. VDI序曲四 个人独享虚拟桌面
  6. 各层电子数排布规则_干货 | 高中化学电子排布、第一电离能和电负性知识汇总...
  7. Oracle 最后通牒:要 Java 8 更新先交钱!
  8. TensorFlow.js 来了!浏览器上线机器学习功能
  9. Tomcat启动时日志报 dcom.sun.manager.jmxremote 异常导致无法正常启动使用
  10. C语言学生管理系统(链表实现)
  11. python编程解数学方程(纯字符串格式)
  12. 5GNR漫谈12:PRACH随机接入信道(2)
  13. centos 下 yum安装python3
  14. 小甜甜布兰妮的饮食瘦身套餐
  15. 阿里云——媒体云(视频直播)
  16. 学计算机的桌面,三个软件,干净你的电脑桌面,让你更高效工作学习!
  17. python中文朗读_Python:语音处理,实现在线朗读RFC文档或本地文本文件
  18. 利息计算的方式及实现
  19. Flutter 导航教程
  20. Cognex Designer中的数据显示-----你不知道的BUG

热门文章

  1. java io 创建文件夹_Java中Io流操作-File类的常用操作-创建文件,创建文件夹
  2. 关于我的文章说明及联系方式
  3. 初识openwrt(上)
  4. SDL 1.2.14在windows平台下的编译及例子
  5. linux添加qcc,Alpine Linux添加Let’s Encrypt CA证书或者自签CA证书
  6. 【Elasticsearch】如何在生产中执行Elasticsearch的零停机升级
  7. 95-290-360-源码-内存管理-Buffer-ByteBufferPool简介
  8. spark学习-JavaRDD注册成表然后用SparkSQL查询
  9. Rabbitmq的三种方式
  10. 配置监控中心-及管理平台