【hive】hive分桶表的学习

hive分桶表的学习

前言:

每一个表或者分区,hive都可以进一步组织成桶,桶是更细粒度的数据划分,他本质不会改变表或分区的目录组织方式,他会改变数据在文件中的分布方式。

分桶规则:

对分桶字段值进行哈希,哈希值除以桶的个数求余,余数决定了该条记录在哪个桶中,也就是余数相同的在一个桶中。桶为表加上额外结构,链接相同列划分了桶的表,可以使用map-side join更加高效。

优势和使用情境:

  1. 分桶表可以提高特定查询的性能,尤其是在连接操作、聚合操作等涉及数据分发和处理的情况下。
  2. 适用于大型数据集,特别是当数据无法全部存放在内存中时。
  3. 分桶表通常与 Hive 的表分区结合使用,以进一步优化查询性能。

一、建表

通过 clustered by(字段名) into bucket_num buckets 分桶,意思是根据字段名分成bucket_num个桶

复制代码
create table test_bucket (
id int comment 'ID', 
name string comment '名字'
)
comment '测试分桶'
clustered by(id) into 4 buckets
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';

二、插入数据

2.1 准备数据

buckt_data.txt

复制代码
1,name1
2,name2
3,name3
4,name4
5,name5
6,name6
7,name7
8,name8
9,name9

2.2 加载数据

直接load data不会有分桶的效果,这样和不分桶一样,在HDFS上只有一个文件。

复制代码
load data local inpath '/opt/test/buckt_data.txt' into table test_bucket;

需要借助中间表

复制代码
create table text_bucket_test (
id int comment 'ID', 
name string comment '名字'
)
comment '测试分桶中间表'
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' ;

先将数据load到中间表

复制代码
load data local inpath '/opt/test/buckt_data.txt' into table text_bucket_test;

然后通过下面的语句,将中间表的数据插入到分桶表中,这样会产生四个文件。

复制代码
insert into test_bucket select * from text_bucket_test;

然后我们查看分桶表的数据目录,发现好像也只有一个文件,并没有按之前的4个文件,也就是4个桶这样来划分。

分桶也就是分区,分区数量等于文件数,所以上面方法并没有分桶。

所以需要开启强制分桶:

复制代码
set hive.enforce.bucketing = true;   开启强制分桶

重新导入数据:

复制代码
insert into  test_bucket  select *  from text_bucket_test;

发现组织文件的有变化:

三、查看结果

用sql看和用hadoop命令看每个文件,结果每个桶内都是按id升序排序的,也就是和最开始的截图是一样的

好处

因为每个桶内的数据是排序的,这样每个桶进行连接时就变成了高效的归并排序

四、提高join查询效率

假设表A和表B进行join,join的字段为id 条件:

  • 1、两个表为大表
  • 2、两个表都为分桶表
  • 3、A表的桶数是B表桶数的倍数或因子

这样join查询时候,表A的每个桶就可以和表B对应的桶直接join,而不用全表join,提高查询效率 比如A表桶数为4,B表桶数为8,那么桶数对应关系为

表A 表B
0 0
1 1
2 2
3 3
0 4
1 5
2 6
3 7

五、提高抽样效率

5.1 sql示例:

复制代码
hive> select * from test_bucket tablesample (bucket 1 out of 2);
OK
8   name8
4   name4
2   name2
6   name6
hive> select * from txt_bucket_test tablesample (bucket 1 out of 2 on id);
OK
2   name2
8   name8
4   name4
6   name6

5.2 区别:

  • 分桶表后面可以不带on 字段名,不带时默认的是按分桶字段,也可以带,而没有分桶的表则必须带
  • 按分桶字段取样时,因为分桶表是直接去对应的桶中拿数据,在表比较大时会提高取样效率

5.3 语法:

复制代码
tablesample (bucket x out of y on id);
  1. x表示从哪个桶(x-1)开始,y代表分几个桶,也可以理解分x为分子,y为分母,及将表分为y份(桶),取第x份(桶)
  2. 所以这时对于分桶表是有要求的,y为桶数的倍数或因子,y必须是table总bucket数的倍数或者因子。hive根据y的大小,决定抽样的比例。例如,table总共分了64份,当y=32时,抽取(64/32=)2个bucket的数据,当y=128时,抽取(64/128=)1/2个bucket的数据。
  3. x表示从哪个bucket开始抽取。例如,table总bucket数为32,tablesample(bucket 3 out of 16),表示总共抽取(32/16=)2个bucket的数据,分别为第3个bucket和第(3+16=)19个bucket的数据。
相关推荐
不太可爱的叶某人7 分钟前
【学习笔记】kafka权威指南——第8章 跨集群数据镜像(7-10章只做了解)
笔记·学习·kafka
wdfk_prog16 分钟前
[Linux]学习笔记系列 -- lib/timerqueue.c Timer Queue Management 高精度定时器的有序数据结构
linux·c语言·数据结构·笔记·单片机·学习·安全
wdfk_prog1 小时前
构建基于Hexo、Butterfly、GitHub与Cloudflare的高性能个人博客
笔记·学习·github·hexo·blog
shixian10304112 小时前
Django 学习日志
数据库·学习·sqlite
丰锋ff3 小时前
2013 年真题配套词汇单词笔记(考研真相)
笔记·学习·考研
小小程序媛(*^▽^*)3 小时前
第十二届全国社会媒体处理大会笔记
人工智能·笔记·学习·ai
毕设源码-邱学长4 小时前
【开题答辩全过程】以 爱学习教育网站为例,包含答辩的问题和答案
学习
Yupureki4 小时前
从零开始的C++学习生活 5:内存管理和模板初阶
c语言·c++·学习·visual studio
程序员Aries4 小时前
从零开始实现一个高并发内存池_DayThree:内存池整体框架与ThreadCache、TLS无锁访问
c++·学习·单例模式
Ethan learn English5 小时前
汽车零部件英语词汇 | 3000 最常用单词系列
笔记·学习·汽车·生活·英语·可理解性输入