Hive中order by,sort by,distribute by,cluster by的区别

Hive中order by,sort by,distribute by,cluster by的区别一 orderbyorder 会对输入做全局排序 因此只有一个 Reducer 多个 Reducer 无法保证全局有序 然而只有一个 Reducer 会导致当输入规模较大时 消耗较长的计算时间 关于 orderby 的详细介绍请参考这篇文章 HiveOrderby 操作 二 sortbysortby 不是全局排序 其在数据进入 reducer 前完成排序 因此 如果用 sortb

一: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

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

使用sort by按id降序排列:

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

#distribute by

hive (hive)> select * from user; OK id name 1 lavimer 2 liaozhongmin 3 liaozemin 100 hello 200 hadoop

#设置reduce的个数

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

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

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

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

#导出到本地的数据

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

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

#distribute by和sort by结合使用


hive (hive)> select * from temperature; OK year tempra 2008 30`C 2008 35`C 2008 32.5`C 2008 31.5`C 2008 31`C 2015 41`C 2015 39`C 2015 36`C 2015 33`C 2015 35`C 2015 37`C

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

hive (hive)> select * from temperature distribute by year sort by year asc,tempra desc; //MapReduce... Hadoop job information for Stage-1: number of mappers: 1; number of reducers: 2 //MapReduce... OK year tempra 2008 35`C 2008 32.5`C 2008 31`C 2008 31.5`C 2008 30`C 2015 41`C 2015 39`C 2015 37`C 2015 36`C 2015 35`C 2015 33`C Time taken: 17.358 seconds







版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/231099.html原文链接:https://javaforall.net

(0)
上一篇 2026年1月28日 下午8:01
下一篇 2026年1月28日 下午8:22


相关推荐

  • Cursor 实战技巧:如何快速配置 Python 环境

    Cursor 实战技巧:如何快速配置 Python 环境

    2026年3月16日
    2
  • linux必学的60个命令解释_linux常用命令及用法

    linux必学的60个命令解释_linux常用命令及用法Linux提供了大量的命令,利用它可以有效地完成大量的工作,如磁盘操作、文件存取、目录操作、进程管理、文件权限设定等。所以,在Linux系统上工作离不开使用系统提供的命令。要想真正理解Linux系统,就必须从Linux命令学起,通过基础的命令学习可以进一步理解Linux系统。不同Linux发行版的命令数量不一样,但Linux发行版本最少的命令也有200多个。这里笔者把比较重要和使用频率最多的命令,按照它们在系统中的作用分成下面六个部分一一介绍。◆安装和登录命令:login、shutdown、hal

    2025年12月9日
    5
  • java实现字符串反转(javastring替换字符串)

    目录字符串反转:1,charAt()2,toCharArray()3,reverse()字符串替换:1.replace()2.replaceAll()3.replaceFirst()字符串反转:1,charAt()通过String类的charAt()的方法来获取字符串中的每一个字符,然后将其拼接为一个新的字符串publicstatic…

    2022年4月18日
    43
  • c语言怎么进行大整数加法,c语言 大整数加法

    c语言怎么进行大整数加法,c语言 大整数加法2013 12 07 回答以前我也做过一个大整数程序 2000 不过那里面没有减法 做这个减法真让花时间啊 include include include definemax400 数位上限 dd char a chart max inti j for i 0 i if a i null for j 0 i gt 0 j i t j a i 1 st

    2026年3月26日
    3
  • Web Visibilitychange

    Web Visibilitychangevisibilitychange(vc贝雷忒change)浏览器标签页被隐藏或显示的时候会触发visibilitychange事件. visible:当前页面可见.即此页面在前景标签页中,并且窗口没有最小化. hidden:页面对用户不可见.即文档处于背景标签页或者窗口处于最小化状态,或者操作系统正处于’锁屏状态’. prerender:页面此时正在渲染中,因此是不可见的.文档只能从此状态开始,永远不能从其他值变为此状态.注意:浏览器支持是可选的. unloaded

    2022年6月28日
    36
  • QQ对话机器人 simsimi接口

    QQ对话机器人 simsimi接口求轻喷是 2843943395 源码比较乱我重构下再发出来转载于 https www cnblogs com fuis p 3825517 html

    2026年3月17日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号