一:order by

order by会对输入做全局排序,因此只有一个Reducer(多个Reducer无法保证全局有序),然而只有一个Reducer,会导致当输入规模较大时,消耗较长的计算时间。关于order by的详细介绍请参考这篇文章:Hive Order by操作

二:sort by

sort by不是全局排序,其在数据进入reducer前完成排序,因此,如果用sort by进行排序,并且设置mapred.reduce.tasks>1,则sort by只会保证每个reducer的输出有序,并不保证全局有序。sort by不同于order by,它不受Hive.mapred.mode属性的影响,sort by的数据只能保证在同一个reduce中的数据可以按指定字段排序。使用sort by你可以指定执行的reduce个数(通过set mapred.reduce.tasks=n来指定),对输出的数据再执行归并排序,即可得到全部结果。

三:distribute by

distribute by是控制在map端如何拆分数据给reduce端的。hive会根据distribute by后面列,对应reduce的个数进行分发,默认是采用hash算法。sort by为每个reduce产生一个排序文件。在有些情况下,你需要控制某个特定行应该到哪个reducer,这通常是为了进行后续的聚集操作。distribute by刚好可以做这件事。因此,distribute by经常和sort by配合使用。

注:Distribute by和sort by的使用场景

1.Map输出的文件大小不均。

2.Reduce输出文件大小不均。

3.小文件过多。

4.文件超大。

四:cluster by

cluster by除了具有distribute by的功能外还兼具sort by的功能。但是排序只能是倒叙排序,不能指定排序规则为ASC或者DESC。

示例:

#sort by

  1. hive (hive)> select * from user;
  2. OK
  3. id  name
  4. 1   lavimer
  5. 2   liaozhongmin
  6. 3   liaozemin

使用sort by按id降序排列:

  1. hive (hive)> select * from user sort by id desc;
  2. //MapReduce...
  3. Execution completed successfully
  4. Mapred Local Task Succeeded . Convert the Join into MapJoin
  5. OK
  6. id  name
  7. 3   liaozemin
  8. 2   liaozhongmin
  9. 1   lavimer
  10. Time taken: 3.828 seconds

#distribute by

  1. hive (hive)> select * from user;
  2. OK
  3. id  name
  4. 1   lavimer
  5. 2   liaozhongmin
  6. 3   liaozemin
  7. 100 hello
  8. 200 hadoop

#设置reduce的个数

  1. hive (hive)> set mapred.reduce.tasks=2;
  2. hive (hive)> set mapred.reduce.tasks;
  3. mapred.reduce.tasks=2

#使用带distribute by的数据从user表中导出数据

  1. hive (hive)> insert overwrite local directory '/usr/local/src/user.txt' select * from user distribute by id;
  2. //MapReduce...
  3. Hadoop job information for Stage-1: number of mappers: 1; number of reducers: 2

注:从上述语句执行过程可以看到启动了两个Reducer。

#导出到本地的数据

  1. [root@liaozhongmin5 src]# cd user.txt/
  2. [root@liaozhongmin5 user.txt]# ll
  3. 总用量 8
  4. -rwxrwxrwx. 1 root root 36 1月  30 14:35 000000_0
  5. -rwxrwxrwx. 1 root root 22 1月  30 14:35 000001_0
  6. [root@liaozhongmin5 user.txt]# more 000000_0
  7. 2<span style="white-space:pre">  </span>liaozhongmin
  8. 100<span style="white-space:pre"> </span>hello
  9. 200<span style="white-space:pre"> </span>hadoop
  10. [root@liaozhongmin5 user.txt]# more 000001_0
  11. 1<span style="white-space:pre">  </span>lavimer
  12. 3<span style="white-space:pre">  </span>liaozemin
  13. [root@liaozhongmin5 user.txt]#

注:从上述结果中,我们可以看到数据被分发到了两个Reducer中处理。

#distribute by和sort by结合使用

  1. hive (hive)> select * from temperature;
  2. OK
  3. year    tempra
  4. 2008    30`C
  5. 2008    35`C
  6. 2008    32.5`C
  7. 2008    31.5`C
  8. 2008    31`C
  9. 2015    41`C
  10. 2015    39`C
  11. 2015    36`C
  12. 2015    33`C
  13. 2015    35`C
  14. 2015    37`C

#根据年份和气温对气象数据进行排序,以确保所具有相同年份的行最终都在一个reduce分区中。

    1. hive (hive)> select * from temperature distribute by year sort by year asc,tempra desc;
    2. //MapReduce...
    3. Hadoop job information for Stage-1: number of mappers: 1; number of reducers: 2
    4. //MapReduce...
    5. OK
    6. year    tempra
    7. 2008    35`C
    8. 2008    32.5`C
    9. 2008    31`C
    10. 2008    31.5`C
    11. 2008    30`C
    12. 2015    41`C
    13. 2015    39`C
    14. 2015    37`C
    15. 2015    36`C
    16. 2015    35`C
    17. 2015    33`C
    18. Time taken: 17.358 seconds

Hive中order by,sort by,distribute by,cluster by的区别的更多相关文章

  1. hive中order by ,sort by ,distribute by, cluster by 的区别(**很详细**)

    hive 查询语法 select [all | distinct] select_ condition, select_ condition from table_name a [join table ...

  2. hive中order by,sort by, distribute by, cluster by作用以及用法

    1. order by     Hive中的order by跟传统的sql语言中的order by作用是一样的,会对查询的结果做一次全局排序,所以说,只有hive的sql中制定了order by所有的 ...

  3. [转载]hive中order by,sort by, distribute by, cluster by作用以及用法

    1. order by     Hive中的order by跟传统的sql语言中的order by作用是一样的,会对查询的结果做一次全局排序,所以说,只有hive的sql中制定了order by所有的 ...

  4. hive中order by,sort by, distribute by, cluster by的用法

    1.order by hive中的order by 和传统sql中的order by 一样,对数据做全局排序,加上排序,会新启动一个job进行排序,会把所有数据放到同一个reduce中进行处理,不管数 ...

  5. hive 中 Order by, Sort by ,Dristribute by,Cluster By 的作用和用法

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

  6. hive 排序 order by sort by distribute by cluster by

    order by:     order by是全局排序,受hive.mapred.mode的影响.       使用orderby有一些限制:     1.在严格模式下(hive.mapred.mod ...

  7. hive中order by、distribute by、sort by和cluster by的区别和联系

    hive中order by.distribute by.sort by和cluster by的区别和联系 order by order by 会对数据进行全局排序,和oracle和mysql等数据库中 ...

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

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

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

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

随机推荐

  1. HDUOJ-------Being a Good Boy in Spring Festival

    Being a Good Boy in Spring Festival Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32 ...

  2. 【LeetCode】137. Single Number II (3 solutions)

    Single Number II Given an array of integers, every element appears threetimes except for one. Find t ...

  3. Everything:速度最快的文件名搜索工具

    http://xbeta.info/everything-search-tool.htm Everything(官网|中文主页|教程)是速度最快的文件名搜索软件.其速度之快令人震惊,百G硬盘几十万个文 ...

  4. asp.net core mvc视频A:笔记4-1.数据验证

    开发建议:永远不要相信客户端提交过来的数据!!! 前端数据验证定位:提高用户体验,仅此而已! 后端数据验证定位:保证系统安全与数据完整!!! 实例:用户登录验证 定义一个用户登录类 在用户登录类基础上 ...

  5. iOS接收null的处理方法

    常常server返回的数据,有null,还有nil,假设在模型层不处理的话,到时候数据展现时,一定会崩啊,近期决心要解决问题,所以查看了一些资料后,有答案了: - (id) setNoNull:(id ...

  6. 如何设置Docker容器中Java应用的内存限制

    如果使用官方的Java镜像,或者基于Java镜像构建的Docker镜像,都可以通过传递 JAVA_OPTS 环境变量来轻松地设置JVM的内存参数.比如,对于官方Tomcat 镜像,我们可以执行下面命令 ...

  7. [sql]mysql启停脚本

    写了个较为完善的mysql多实例的启动停止脚本. [root@lanny 3307]# cat mysql #!/bin/sh [ $# != 1 ]&&{ echo "US ...

  8. documentdb

    https://azure.microsoft.com/en-us/services/documentdb/ https://www.simple-talk.com/cloud/cloud-data/ ...

  9. Java多线程和并发基础

    第一:Java多线程面试问题 1:进程和线程之间有什么不同? 一个进程是一个独立(self contained)的运行环境,它可以被看作一个程序或者一个应用.而线程是在进程中执行的一个任务.Java运 ...

  10. javascript高级:原型与继承

    原型继承的本质就是一条原型链,对象会沿着这条链,访问链里的方法属性. 对象的__proto__属性就是用于访问它的原型链的上一层: 考虑以下对象: 1. 所有对象的原型: Object.prototy ...