软件下载网站如何履行安全,陕西网站备案代理,做戒指网站的logo照片,如何进入wordpress前台hive分桶表的学习
前言#xff1a;
每一个表或者分区#xff0c;hive都可以进一步组织成桶#xff0c;桶是更细粒度的数据划分#xff0c;他本质不会改变表或分区的目录组织方式#xff0c;他会改变数据在文件中的分布方式。
分桶规则#xff1a;
对分桶字段值进行哈…hive分桶表的学习
前言
每一个表或者分区hive都可以进一步组织成桶桶是更细粒度的数据划分他本质不会改变表或分区的目录组织方式他会改变数据在文件中的分布方式。
分桶规则
对分桶字段值进行哈希哈希值除以桶的个数求余余数决定了该条记录在哪个桶中也就是余数相同的在一个桶中。桶为表加上额外结构链接相同列划分了桶的表可以使用map-side join更加高效。
优势和使用情境
分桶表可以提高特定查询的性能尤其是在连接操作、聚合操作等涉及数据分发和处理的情况下。适用于大型数据集特别是当数据无法全部存放在内存中时。分桶表通常与 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,name92.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进行joinjoin的字段为id 条件
1、两个表为大表2、两个表都为分桶表3、A表的桶数是B表桶数的倍数或因子
这样join查询时候表A的每个桶就可以和表B对应的桶直接join而不用全表join提高查询效率 比如A表桶数为4B表桶数为8那么桶数对应关系为
表A表B0011223304152637
五、提高抽样效率
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 name65.2 区别
分桶表后面可以不带on 字段名不带时默认的是按分桶字段,也可以带而没有分桶的表则必须带按分桶字段取样时因为分桶表是直接去对应的桶中拿数据在表比较大时会提高取样效率
5.3 语法
tablesample (bucket x out of y on id);x表示从哪个桶(x-1)开始y代表分几个桶也可以理解分x为分子y为分母及将表分为y份(桶)取第x份(桶)所以这时对于分桶表是有要求的y为桶数的倍数或因子y必须是table总bucket数的倍数或者因子。hive根据y的大小决定抽样的比例。例如table总共分了64份当y32时抽取(64/32)2个bucket的数据当y128时抽取(64/128)1/2个bucket的数据。x表示从哪个bucket开始抽取。例如table总bucket数为32tablesample(bucket 3 out of 16)表示总共抽取(32/16)2个bucket的数据分别为第3个bucket和第(316)19个bucket的数据。