hive桶表好处
对于每一个表(table)或者分区, Hive可以进一步组织成桶,也就是说桶是更为细粒度的数据范围划分。Hive也是针对某一列进行桶的组织。Hive采用对列值哈希,然后除以桶的个数求余的方式决定该条记录存放在哪个桶当中。所谓Hive中的分桶,实际就是指的MapReduce中的分区。根据Reduce的数量,分成不同个数的文件。
我们先准备我们将使用的分桶表的数据.
1,jack,2016/11/11
2,michael,2016/11/12
3,summer,2016/11/13
4,spring,2016/11/14
5,nero,2016/11/15
6,book,2016/12/21
7,node,2016/12/22
8,tony,2016/12/23
9,green,2016/12/24
10,andy,2016/12/25
11,kaith,2016/12/26
12,spring,2016/12/27
13,andy,2016/12/28
14,tony,2016/12/29
15,green,2016/12/30
16,andy,2016/12/31
17,kaith,2017/1/1
18,xiaoming,2017/1/2
如上所示,这是一张顾客信息表,3个字段分别代表顾客的id,name,birthday
创建桶表
桶表的建表语法和普通表类似,但是需要制定分桶的规则和桶的个数.
create table t_bucket(id int,name string,birthday string)
clustered by (id) into 4 buckets
row format delimited fields terminated by ',';
我们设定桶表按照id进行分桶,桶内数据按照id进行排序.注意这里的建表语句只是告诉hive,t_bucket这张表是应该按照这种方式去存储,但是并不会在插入数据时帮我们去分桶存储.我们来做个试验:
我们将上面准备好的数据插入t_bucket表
load data local inpath '/home/spark/jar/testdata/Customer.txt' into table t_bucket;
然后我们到hdfs的目录去查看,发现并没有安装我们预先设计的方式去存储数据,数据文件个数为一个;
hive (test_neil)> dfs -ls /user/hive/warehouse/test_neil.db/t_bucket;
Found 1 items
-rwxr-xr-x 1 root staff 364 2017-02-05 12:44 /user/hive/warehouse/test_neil.db/t_bucket/Customer.txt
事实上hive采用的为读时模式,他并不会去判断插入表的数据是否符合元数据的信息.因为我们使用load插入数据并不会产生reduce,数据量较小,只生成了一个数据文件,因此这并不是一个分桶表.一般我们并不采用load的方式去加载数据到bucket表,我们采用insert的方式,使用select将数据变成我们分桶指定的模式.
正确的load方式
开始往创建的分通表插入数据(插入数据需要是已分桶, 且排序的)
可以使用distribute by(id) sort by(id asc)
排序和分桶的字段相同的时候也可以使用Cluster by(字段)
注意使用cluster by 就等同于分桶+排序(sort)
首先我们把数据导入另外一张表中
create table t_temp(id int,name string,birthday string)
row format delimited fields terminated by ',';
load data local inpath 'home/spark/jar/testdata/Customer.txt' into table t_temp;
在我们导入数据前,需要将hive.enforce.bucketing的值设置为true,
set hive.enforce.bucketing = true
这个参数将强制控制ruduce的个数去和我们指定的分桶个数相适配.
将t_bucket表truncate掉,再次导入数据
truncate table t_bucket;
insert into table t_bucket
select id,name,birthday
from t_temp
cluster by id;
在job执行的log中,我们可以看到最终分桶的情况:
Loading data to table test_neil.t_bucket
Table test_neil.t_bucket stats: [numFiles=4, numRows=18, totalSize=346, rawDataSize=328]
我们再次去查看t_bucket表的目录发现,这张表的数据已经被分成了四份,这样我们便成功的将文件进行了分桶的操作;
hive (test_neil)> dfs -ls /user/hive/warehouse/test_neil.db/t_bucket;
Found 4 items
-rwxr-xr-x 1 root staff 78 2017-02-05 13:14 /user/hive/warehouse/test_neil.db/t_bucket/000000_0
-rwxr-xr-x 1 root staff 92 2017-02-05 13:14 /user/hive/warehouse/test_neil.db/t_bucket/000001_0
-rwxr-xr-x 1 root staff 98 2017-02-05 13:14 /user/hive/warehouse/test_neil.db/t_bucket/000002_0
-rwxr-xr-x 1 root staff 78 2017-02-05 13:14 /user/hive/warehouse/test_neil.db/t_bucket/000003_0
我们去查看文件的内容:
dfs -cat /user/hive/warehouse/test_neil.db/t_bucket/000000_0;
dfs -cat /user/hive/warehouse/test_neil.db/t_bucket/000001_0;
dfs -cat /user/hive/warehouse/test_neil.db/t_bucket/000002_0;
dfs -cat /user/hive/warehouse/test_neil.db/t_bucket/000003_0;
结果:
4/spring/2016/11/14
8/tony/2016/12/23
12/spring/2016/12/27
16/andy/2016/12/31
1/jack/2016/11/11
5/nero/2016/11/15
9/green/2016/12/24
13/andy/2016/12/28
17/kaith/2017/1/1
2/michael/2016/11/12
6/book/2016/12/21
10/andy/2016/12/25
14/tony/2016/12/29
18/xiaoming/2017/1/2
3/summer/2016/11/13
7/node/2016/12/22
11/kaith/2016/12/26
15/green/2016/12/30
我们可以看到,我们的客户数据被分成了四份.那么这四份是如何进行划分的呢?其实我们已经制定了按照id进行划分,因此hive使用hash散列的方式,将id个数对桶个数求余数,我们id为18个,对桶个数(4个)求余数,结果为4.这样每个桶最少有4条数据,同时这样的方式得到的桶内数据其实相当于是随机的.
cluster by和distribute by
在上面的select语句中,我们使用了cluster by语句执行分桶的方式.我们发现其实桶内的数据是按照id字段进行升序排列的.其实cluster by相当于distribute by+sort by.sort by默认按照升序进行排列.
sort by排序的为reducer内的数据,在这里就是bucket内的数据.这样数据是局部有序的,而order by是全局有序的.执行了order by,最后只能有个reduce,因为要做全局的排序.
但是呢,distribute by+sort by的组合会更加的灵活,因为我们可以去按照id分桶,按照birthday去进行排序.我们可以做如下的试验.
insert into table t_bucket
select id,name,birthday
from t_temp
distribute by id sort by birthday desc;
我们再去执行select,发现数据是按照id进行分桶的,但是数据的排列顺序其实是按照birthday进行降序排列的.
16 andy 2016/12/31
12 spring 2016/12/27
8 tony 2016/12/23
4 spring 2016/11/14
17 kaith 2017/1/1
13 andy 2016/12/28
9 green 2016/12/24
5 nero 2016/11/15
1 jack 2016/11/11
18 xiaoming 2017/1/2
14 tony 2016/12/29
10 andy 2016/12/25
6 book 2016/12/21
2 michael 2016/11/12
15 green 2016/12/30
11 kaith 2016/12/26
7 node 2016/12/22
3 summer 2016/11/13
分桶的好处
1. 获得更高的查询处理效率,分桶加快了join查询的速度.
对于map端连接的情况,两个表以相同方式划分桶。处理左边表内某个桶的 mapper知道右边表内相匹配的行在对应的桶内。因此,mapper只需要获取那个桶 (这只是右边表内存储数据的一小部分)即可进行连接。这一优化方法并不一定要求 两个表必须桶的个数相同,两个表的桶个数是倍数关系也可以.这样便采用了Map-side join的方式,避免全表进行笛卡尔积的操作.
观察下面例子:
select a.id,a.name,b.addr from a join b on a.id = b.id; 如果a表和b表已经是分桶表,而且分桶的字段是id字段,那么做这个操作的时候就不需要再进行全表笛卡尔积了。但是如果标注了分桶但是实际上数据并没有分桶,那么结果就会出问题。 |
桶为表加上了额外的结构,Hive 在处理有些查询时能利用这个结构。具体而言,连接两个在(包含连接列的)相同列上划分了桶的表,可以使用 Map 端连接 (Map-side join)高效的实现。比如JOIN操作。对于JOIN操作两个表有一个相同的列,如果对这两个表都进行了桶操作。那么将保存相同列值的桶进行JOIN操作就可以,可以大大较少JOIN的数据量。 |
**关于桶内排序的意义:
桶中的数据可以根据一个或多个列另外进行排序。由于这样对每个桶的连接变成了高效的归并排序(merge-sort), 因此可以进一步提升map端连接的效率。**
**分桶个数:
如果两个表的分桶个数之间没有什么倍数的关系,这样分桶表在做join时并不会提升效率,因为数据随机分发,桶和桶之间并没有对应关系.**
2.使取样(sampling)更加的高效
在处理大规模数据集时,在开发和修改查询的阶段,如果能在数据集的一小部分数据上试运行查询,会带来很多方便.
使用上面的t-bucket我们进行演示.
假如我们使用的为一个大规模的数据集,我们只想去抽取部分数据进行查看.使用bucket表可以变得更加的高效。
select * from t_bucket tablesample(bucket 1 out of 4);
select * from t_bucket tablesample(bucket 1 out of 4 on id);
这样表示我们从bucket1开始取样1个bucket的数据.
select * from t_bucket tablesample(bucket x out of y on xx);
x表示从哪个bucket进行抽样,桶计数从1开始.y用来计算抽取数据的量,计算方式为分桶数/y.假设我们一共分了128个桶,y设置为32,则表示要抽取4个bucket,如果x为12,则抽取的数据来自于12/13/14/15.y的值可以不为桶个数的公约数,可以为任意值.
总结:
1、order by 会对输入做全局排序,因此只有一个reducer,会导致当输入规模较大时,需要较长的计算时间。
2、sort by不是全局排序,其在数据进入reducer前完成排序。因此,如果用sort by进行排序,并且设置mapred.reduce.tasks>1,则sort by只保证每个reducer的输出有序,不保证全局有序。
3、distribute by(字段)根据指定的字段将数据分到不同的reducer,且分发算法是hash散列。
4、Cluster by(字段) 除了具有Distribute by的功能外,还会对该字段进行排序。
5、创建分桶表并不意味着load进数据也是分桶的,你必须先分好桶,然后再放到表中。
因此,如果分桶和sort字段是同一个时,此时,cluster by = distribute by + sort by
分桶表的作用:最大的作用是用来提高join操作的效率;但是两者的分桶数要相同或者成倍数。
为什么可以提高join操作的效率呢?因为按照MapReduce的分区算法,是Id的HashCode值模上ReduceTaskNumbers,所以一个ID会分到同一个桶中,这样合并就不用整个表遍历求笛卡尔积了,对应的桶合并就可以了。
参考资料:
http://www.mamicode.com/info-detail-1781619.html
http://m.blog.csdn.net/qq_26937525/article/details/54880980
hive桶表好处的更多相关文章
- hive 桶表
转自:https://blog.csdn.net/csdnliuxin123524/article/details/81052974 桶表(bucket table): 原理: 分区表是按照经常查询的 ...
- hive桶表
创建桶表,提高查询速度, 下免.tom'jerry'scott如果他们经过hash计算,得到的hash值一样,则放到桶一个表中. 创建桶表 指明桶的分桶条件,以sname分桶;分为5个桶
- 分区表,桶表,外部表,以及hive一些命令行小工具
hive中的表与hdfs中的文件通过metastore关联起来的.Hive的数据模型:内部表,分区表,外部表,桶表受控表(managed table):包括内部表,分区表,桶表 内部表: 我们删除表的 ...
- hive中的分桶表
桶表也是一种用于优化查询而设计的表类型.创建通表时,指定桶的个数.分桶的依据字段,hive就可以自动将数据分桶存储.查询时只需要遍历一个桶里的数据,或者遍历部分桶,这样就提高了查询效率 ------创 ...
- Hive SQL之分区表与分桶表
Hive sql是Hive 用户使用Hive的主要工具.Hive SQL是类似于ANSI SQL标准的SQL语言,但是两者有不完全相同.Hive SQL和Mysql的SQL方言最为接近,但是两者之间也 ...
- hadoop笔记之Hive的数据存储(桶表)
Hive的数据存储(桶表) Hive的数据存储(桶表) 桶表 桶表是对数据进行哈希取值,然后放到不同文件中存储. 比如说,创建三个桶,而创建桶的原则可以按照左边表中学生的名字来创建对应的桶.这样子把左 ...
- 一起学Hive——创建内部表、外部表、分区表和分桶表及导入数据
Hive本身并不存储数据,而是将数据存储在Hadoop的HDFS中,表名对应HDFS中的目录/文件.根据数据的不同存储方式,将Hive表分为外部表.内部表.分区表和分桶表四种数据模型.每种数据模型各有 ...
- hive 分区表和分桶表
1.创建分区表 hive> create table weather_list(year int,data int) partitioned by (createtime string,area ...
- 第2节 hive基本操作:11、hive当中的分桶表以及修改表删除表数据加载数据导出等
分桶表 将数据按照指定的字段进行分成多个桶中去,说白了就是将数据按照字段进行划分,可以将数据按照字段划分到多个文件当中去 开启hive的桶表功能 set hive.enforce.bucketing= ...
随机推荐
- 让ASP.NET Web API支持$format参数的方法
在不使用OData的情况下,也可以让ASP.NET Web API支持$format参数,只要在WebApiConfig里添加如下三行红色粗体代码即可: using System; using Sys ...
- Nginx 配置TCP代理
Nginx 1.9 版本以后增加了stream模块,可以对tcp,udp请求进行代理和负载均衡了,今天来体验一下首先编译安装过程configure的时候增加选项 --with-stream --wit ...
- AndroidManifest: windowSoftInputMode属性总结
在Android中,可以通过给Activity设置windowSoftInputMode这个属性来控制软键盘与Activity的主窗口的交互方式. 1. 当Activity成为用户注意的焦点时软键盘的 ...
- https://stackoverflow.com/questions/51751426/failed-to-run-the-da-platform-trial-vm
https://stackoverflow.com/questions/51751426/failed-to-run-the-da-platform-trial-vm { "annotat ...
- 【Java】接口(interface)VS抽象类
接口(interface)可以说成是抽象类的一种特例,接口中的所有方法都必须是抽象的.接口中的方法定义默认为public abstract类型,接口中的成员变量类型默认为public static f ...
- 关于批判性思维(Critical Thinking)
批判性思维(CriticalThinking)就是通过一定的标准评价思维,进而改善思维,是合理的.反思性的思维,既是思维技能,也是思维倾向. 批判性思维是在普通思维的基础上又加了第二层思考,并对第一层 ...
- Linux嵌入式时区修改
- Office 2007 打开时总是出现配置进度框
解决办法: cmd 打开控制台 输入命令:reg add HKCU\Software\Microsoft\Office\12.0\Word\Options /v NoReReg /t REG_DWOR ...
- PLSQL存储过程(基础篇)-转
我不是专门的开发人员,但存储过程又是很重要的知识,为了能够很好的记忆,现把这些基础知识总结一下.存储过程可以实现代码的充分共享,提高系统性能. 基础篇 知识回顾 如果经常使用特定操作,哪么 ...
- Ubuntu下在Apache中运行Keystone
最近一次从Github上更新Keystone的代码后,发现原来bin/keystone-all和bin/keystone-manage都不见了,取而代之的是keystone/cmd/目录下的all.p ...