hive中order by ,sort by ,distribute by, cluster by 的区别(**很详细**)
hive 查询语法
select [all | distinct] select_ condition, select_ condition
from table_name a
[join table_other b on a.id=b.id]
[where wehre_condition]
[group by col_list [having condition]]
[cluster by col_list | [distribute by col_list] [sort by col_list | order by col_list]]
[limit number]
准备数据:
create table if not exists stu_test(id int,name string,sex string,age int)
row format delimited fields terminated by ','
;
insert into stu_test values
(1,'zs','m',18)
,(2,'ls','m',19)
,(3,'ww','m',20)
,(4,'zq','f',18)
,(5,'ll','f',21)
,(6,'hl','f',19)
,(7,'xh','f',20)
,(8,'cl','f',22)
,(9,'fj','m',19)
,(10,'wb','m',23)
,(11,'wf','f',24)
,(12,'jj','m',21)
,(13,'yy','m',20)
,(14,'ld','f',18)
,(15,'ch','f',22)
;
1.order by col_list:
排序 全局排序 默认为升序asc ,因此只有一个reducer,只有一个reduce task的结果,
比如文件名是000000_0,会导致当输入规模较大时,需要较长的计算时间。
如果指定了hive.mapred.mode=strict(默认值是nonstrict),这时就必须指定limit来限制输出条数,原因是:所有的数据都会在同一个reducer端进行,数据量大的情况下可能不能出结果,那么在这样的严格模式下,必须指定输出的条数。
例如:stu:按照年龄排序
select * from stu_test order by age desc;
结果:
id name sex age
11 wf f 24
10 wb m 23
15 ch f 22
8 cl f 22
5 ll f 21
12 jj m 21
13 yy m 20
7 xh f 20
3 ww m 20
9 fj m 19
6 hl f 19
2 ls m 19
14 ld f 18
1 zs m 18
4 zq f 18
2.sort by col_list :
局部排序,其在数据进入reducer前完成排序。因此,如果用sort by 进行排序,并且设置mapred.reduce.tasks>1,
则sort by 只保证每个reducer的输出有序,不保证全局排序。
在每一个reducetask中,每一个小的输出结果排序,但是当reducetask的个数为1的话和order by 的排序结果一致
注意:sort by 指定的字段仅仅是用于排序的字段,不用于分reducetask输出结果,最终的输出文件中的结果是随机生成的
select * from stu_test sort by age desc;
结果:
id name sex age
11 wf f 24
10 wb m 23
15 ch f 22
8 cl f 22
5 ll f 21
12 jj m 21
13 yy m 20
7 xh f 20
3 ww m 20
9 fj m 19
6 hl f 19
2 ls m 19
14 ld f 18
1 zs m 18
4 zq f 18
正常(set mapreduce.job.reduces=1)结果和sort by 的结果一致
如果设置reduce task 个数为3的话: set mapreduce.job.reduces=3,此时不一致
set mapreduce.job.reduces=3
select * from stu_test sort by age desc;
结果:
id name sex age
10 wb m 23
15 ch f 22
8 cl f 22
5 ll f 21
7 xh f 20
9 fj m 19
6 hl f 19 11 wf f 24
12 jj m 21
3 ww m 20
2 ls m 19
14 ld f 18
4 zq f 18 13 yy m 20
1 zs m 18
随机生成3个文件,然后在每个文件中进行排序。
3.distribute by col_list:
根据指定的字段将数据分到不同的reducer,且分发算法是hash散列
类似于分桶的概念 按照指定的distribute by 字段和 设置的reducetask的个数进行取余分组,但是并没有排序,只是分,没有排序
select * from stu_test distribute by age desc; 错误,不能使用desc,因为它不是排序的意思
set mapreduce.job.reduces=3
select * from stu_test distribute by age;
结果:
id name sex age
000000_0 age%3=0
14 ld f 18
1 zs m 18
4 zq f 18
12 jj m 21
11 wf f 24
5 ll f 21
000000_1 age%3=1
15 ch f 22
9 fj m 19
6 hl f 19
2 ls m 19
8 cl f 22
000000_1 age%3=2
13 yy m 20
7 xh f 20
3 ww m 20
10 wb m 23
set mapreduce.job.reduces=2 select * from stu_test distribute by age;
结果:
000000_0 age%2=0
15 ch f 22
14 ld f 18
13 yy m 20
11 wf f 24
8 cl f 22
7 xh f 20
4 zq f 18
3 ww m 20
1 zs m 18
000000_0 age%2=1
12 jj m 21
6 hl f 19
10 wb m 23
9 fj m 19
5 ll f 21
2 ls m 19
4.cluster by col_list :
除了具有distribute by 的功能外,还会对该字段进行排序
cluster by = distribute by+sort by
cluster by id = distribute by id +sort by id
注意:1)cluster by 和sort by 不可以同时使用
2)当分组字段和排序字段是同一个字段的时候 cluster by id = distribute by id +sort by id
不是同一个字段的时候 请不要使用 cluster by id
select * from stu_test cluster by age;
结果:
id name sex age
000000_0 age%3=0
14 ld f 18
4 zq f 18
1 zs m 18
12 jj m 21
5 ll f 21
11 wf f 24
000000_1 age%3=1
6 hl f 19
2 ls m 19
9 fj m 19
15 ch f 22
8 cl f 22
000000_1 age%3=2
3 ww m 20
13 yy m 20
7 xh f 20
10 wb m 23
hive中order by ,sort by ,distribute by, cluster by 的区别(**很详细**)的更多相关文章
- hive中order by,sort by, distribute by, cluster by作用以及用法
1. order by Hive中的order by跟传统的sql语言中的order by作用是一样的,会对查询的结果做一次全局排序,所以说,只有hive的sql中制定了order by所有的 ...
- [转载]hive中order by,sort by, distribute by, cluster by作用以及用法
1. order by Hive中的order by跟传统的sql语言中的order by作用是一样的,会对查询的结果做一次全局排序,所以说,只有hive的sql中制定了order by所有的 ...
- hive中order by,sort by, distribute by, cluster by的用法
1.order by hive中的order by 和传统sql中的order by 一样,对数据做全局排序,加上排序,会新启动一个job进行排序,会把所有数据放到同一个reduce中进行处理,不管数 ...
- hive 中 Order by, Sort by ,Dristribute by,Cluster By 的作用和用法
order by order by 会对输入做全局排序,因此只有一个reducer(多个reducer无法保证全局有序) 只有一个reducer,会导致当输入规模较大时,需要较长的计算时间. set ...
- hive 排序 order by sort by distribute by cluster by
order by: order by是全局排序,受hive.mapred.mode的影响. 使用orderby有一些限制: 1.在严格模式下(hive.mapred.mod ...
- hive中order by、distribute by、sort by和cluster by的区别和联系
hive中order by.distribute by.sort by和cluster by的区别和联系 order by order by 会对数据进行全局排序,和oracle和mysql等数据库中 ...
- Hive中order by,sort by,distribute by,cluster by的区别
一:order by order by会对输入做全局排序,因此只有一个Reducer(多个Reducer无法保证全局有序),然而只有一个Reducer,会导致当输入规模较大时,消耗较长的计算时间.关于 ...
- Hadoop Hive 中的排序 Order by ,Sort by ,Distribute by以及 Cluster By
order by order by 会对输入做全局排序,因此只有一个reducer(多个reducer无法保证全局有序)只有一个reducer,会导致当输入规模较大时,需要较长的计算时间. set h ...
- [大数据相关] Hive中的全排序:order by,sort by, distribute by
写mapreduce程序时,如果reduce个数>1,想要实现全排序需要控制好map的输出,详见Hadoop简单实现全排序. 现在学了hive,写sql大家都很熟悉,如果一个order by解决 ...
随机推荐
- Java实现 蓝桥杯VIP 算法训练 字符串逆序
问题描述 给定一个字符串,将这个串的所有字母逆序后输出. 输入格式 输入包含一个字符串,长度不超过100,字符串中不含空格. 输出格式 输出包含一个字符串,为上面字符串的逆序. 样例输入 tsinse ...
- Java实现 蓝桥杯VIP 算法训练 蜜蜂飞舞
时间限制:1.0s 内存限制:512.0MB 问题描述 "两只小蜜蜂呀,飞在花丛中呀--" 话说这天天上飞舞着两只蜜蜂,它们在跳一种奇怪的舞蹈.用一个空间直角坐标系来描述这个世界, ...
- Java实现最大连续乘积子数组
1 问题描述 给定一个浮点数组,任意取出数组中的若干个连续的数相乘,请找出其中乘积最大的子数组. 2 解决方案 2.1 蛮力法 该方法的时间复杂度为O(n^2). package com.liuzhe ...
- Java实现第十届蓝桥杯求和
试题 A: 求和 本题总分:5 分 [问题描述] 小明对数位中含有 2.0.1.9 的数字很感兴趣,在 1 到 40 中这样的数包 括 1.2.9.10 至 32.39 和 40,共 28 个,他们的 ...
- [bx] and loop
1.[bx] 表示一个内存单元,它的偏移地址在bx中 mov al,[bx] 2.描述符号() 来表示一个寄存器或一个内存单元中的内容. 约定符号idata表示常量. 3.loop 标号 CPU在执行 ...
- 曹工说JDK源码(1)--ConcurrentHashMap,扩容前大家同在一个哈希桶,为啥扩容后,你去新数组的高位,我只能去低位?
如何计算,一对key/value应该放在哪个哈希桶 大家都知道,hashmap底层是数组+链表(不讨论红黑树的情况),其中,这个数组,我们一般叫做哈希桶,大家如果去看jdk的源码,会发现里面有一些变量 ...
- 写了个全局变量的bug,被同事们打脸!!!
话说栈长前阵子写了一个功能,测试 0 bug 就上线了,上线后也运行好好的,好多天都没有人反馈bug,超爽.. 不出问题还好,出问题就是大问题.. 最近有个客户反馈某些数据混乱问题,看代码死活看不出什 ...
- laravel里的队列学习
首先,我们要搞明白几个概念,从小到大依次有:队列任务,队列,连接. 他们属于依次被包含的关系,一个队列里有许多的队列任务,一个连接中可以有许多队列. 队列任务:对每个用户都会进行的操作,理解为队列任务 ...
- kali系统安装google拼音
1.设置多线程下载 /bin/bash -c "$(curl -sL https://git.io/vokNn)" 2.打开终端,输入下面的命令 apt-fast install ...
- 如何开发一个自己的npm包
目录 一.初始化npm包 二.新建自己的工具类 三.新建入口文件index.js 四.编写单元测试 五.登录仓库 六.发布包 七.安装使用 八.删除包 一.初始化npm包 npm init 运行输入包 ...