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 : 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 : Map: Reduce: Cumulative CPU: 1.88 sec HDFS Read: HDFS Write: SUCCESS
Total MapReduce CPU Time Spent: seconds msec
OK
a
a
b
b
c
c
d
d
Time taken: 24.609 seconds, Fetched: 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=;
hive> select * from test sort BY id ;
MapReduce Jobs Launched:
Job : Map: Reduce: Cumulative CPU: 4.48 sec HDFS Read: HDFS Write: SUCCESS
Total MapReduce CPU Time Spent: seconds msec
OK
a
b
c
d
b
c
d
a
Time taken: 29.574 seconds, Fetched: 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 : Map: Reduce: Cumulative CPU: 4.24 sec HDFS Read: HDFS Write: SUCCESS
Total MapReduce CPU Time Spent: seconds msec
OK
c
c
a
a
d
d
b
b
Time taken: 29.89 seconds, Fetched: 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 : extraneous input 'asc' expecting EOF near '<EOF>' hive> select * from test cluster by id ;
MapReduce Jobs Launched:
Job : Map: Reduce: Cumulative CPU: 4.58 sec HDFS Read: HDFS Write: SUCCESS
Total MapReduce CPU Time Spent: seconds msec
OK
c
c
a
a
d
d
b
b
Time taken: 30.646 seconds, Fetched: row(s)

从上面的日志可以看到:启动了三个reduce分别排序,最后的结果不是有序的。

怎样让最后的结果是有序的呢?

可以这样做:

hive> select a.* from (select * from test cluster by id ) a order by a.id ;
MapReduce Jobs Launched:
Job : Map: Reduce: Cumulative CPU: 4.5 sec HDFS Read: HDFS Write: SUCCESS
Job : Map: Reduce: Cumulative CPU: 1.96 sec HDFS Read: HDFS Write: SUCCESS
Total MapReduce CPU Time Spent: seconds msec
OK
a
a
b
b
c
c
d
d
Time taken: 118.261 seconds, Fetched: row(s)

总结

  • ORDER BY是全局排序,但在数据量大的情况下,花费时间会很长
  • SORT BY是将reduce的单个输出进行排序,不能保证全局有序
  • DISTRIBUTE BY可以按指定字段将数据划分到不同的reduce中
  • 当DISTRIBUTE BY的字段和SORT BY的字段相同时,可以用CLUSTER BY来代替 DISTRIBUTE BY with SORT BY。

Hive中的排序语法的更多相关文章

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

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

  2. Hadoop Hive 中的排序 Order by ,Sort by ,Distribute by以及 Cluster By

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

  3. hive中的全排序

    写mapreduce程序时,如果reduce个数>1,想要实现全排序需要控制好map的输出 现在学了Hive,写sql大家都很熟悉,如果一个order by解决了全排序还用那么麻烦写mapred ...

  4. mysql分组排序取最大值所在行,类似hive中row_number() over partition by

    如下图, 计划实现 :按照 parent_code 分组, 取组中code最大值所在的整条记录,如红色部分.(类似hive中: row_number() over(partition by)) sel ...

  5. [大数据相关] Hive中的全排序:order by,sort by, distribute by

    写mapreduce程序时,如果reduce个数>1,想要实现全排序需要控制好map的输出,详见Hadoop简单实现全排序. 现在学了hive,写sql大家都很熟悉,如果一个order by解决 ...

  6. Hive 中的四种排序详解,再也不会混淆用法了

    Hive 中的四种排序 排序操作是一个比较常见的操作,尤其是在数据分析的时候,我们往往需要对数据进行排序,hive 中和排序相关的有四个关键字,今天我们就看一下,它们都是什么作用. 数据准备 下面我们 ...

  7. Hive 中Join的专题---Join详解

    1.什么是等值连接? 2.hive转换多表join时,如果每个表在join字句中,使用的都是同一个列,该如何处理? 3.LEFT,RIGHT,FULL OUTER连接的作用是什么? 4.LEFT或RI ...

  8. HIVE中的order by操作

    hive中常见的高级查询包括:group by.Order by.join.distribute by.sort by.cluster by.Union all.今天我们来看看order by操作,O ...

  9. 第2节 hive基本操作:12、hive当中的hql语法

    3.2. hive查询语法 3.2.1.SELECT https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Select 基本 ...

随机推荐

  1. (easy)LeetCode 263.Ugly Number

    Write a program to check whether a given number is an ugly number. Ugly numbers are positive numbers ...

  2. (easy)LeetCode 203.Remove Linked List Elements

    Remove all elements from a linked list of integers that have value val. ExampleGiven: 1 --> 2 --& ...

  3. Arch时间校准

    sudo ln -s /usr/share/zoneinfo/UTC /etc/localtime sudo hwclock --systohc --utc sudo timedatectl set- ...

  4. sqlserver 批量删除存储过程和批量修改存储过程的语句

    sqlserver 批量删除存储过程和批量修改存储过程的语句- sqlserver 批量删除存储过程和批量修改存储过程的语句,需要的朋友可以参考下. - 修改: 复制代码 代码如下: declare ...

  5. TestCase--网站注册模块

    对于web测试,注册模块是必测的一个点,所以今天就来总结一下注册模块的测试用例 参考京东的注册页面 测试用例设计如下: 一.功能测试 1.  单击“免费注册”,页面是否正常跳转 2.  直接访问注册页 ...

  6. (续篇3):飞测独家のJmeter秘籍,限量发放

    好东西,分享大家,自上次分享出来fiddler导出jmx格式V4.0版本对外公开后,收到一些反馈,我们利用工作之余时间继续优化,现在一个比较稳定的版本出炉,分享给大伙,我们一起来看看. 特性说明: 版 ...

  7. "开发路上踩过的坑要一个个填起来————持续更新······(7月30日)"

    欢迎转载,请注明出处! https://gii16.github.io/learnmore/2016/07/29/problem.html 踩过的坑及解决方案记录在此篇博文中! 个人理解,如有偏颇,欢 ...

  8. AD采样问题总结

    说明:来源http://bbs.csdn.net/topics/390899032论坛讨论 一个100HZ的正弦波,我用300HZ的采样率去采样,那么根据香农定律是不是一秒钟就采集到300个点,因为这 ...

  9. [mysq]ERROR 2006 (HY000) at line xx: MySQL server has gone away 解决方法

    vi /etc/my.cnf wait_timeout=2880000interactive_timeout = 2880000max_allowed_packet = 100M 完整配置文件 [my ...

  10. java基础回顾(六)——WeakReference、SoftReference

    在Java里, 当一个对象o被创建时, 它被放在Heap里. 当GC运行的时候, 如果发现没有任何引用指向o, o就会被回收以腾出内存空间. 或者换句话说, 一个对象被回收, 必须满足两个条件: 1) ...