1:分桶表结构
2:分桶表原理
①分桶是相对分区进行更细粒度的划分,Hive表或分区表可进一步的分桶。
②分桶将整个数据内容按照某列取hash值,对桶的个数取模的方式决定该条记录存放在哪个桶当中;具有相同hash值的数据进入到同一个文件中。
比如按照name属性分为3个桶,就是对name属性值的hash值对3取摸,按照取模结果对数据分桶。
取模结果为 0 的数据记录存放到一个文件
取模结果为 1 的数据记录存放到一个文件
取模结果为 2 的数据记录存放到一个文件
3:分桶表作用
①取样sampling更高效
没有分桶的话需要扫描整个数据集
做数据应用
②提升某些查询操作效率
例如map side join
4:实战演练:创建分桶表
①在创建分桶表之前要执行的命令
set hive.enforce.bucketing=true; #开启对分桶表的支持
set mapreduce.job.reduces=4; #设置与桶相同的reduce个数(默认只有一个reduce)
②进入hive客户端然后执行以下命令
use myhive;
set hive.enforce.bucketing=true;
set mapreduce.job.reduces=4;
-- 创建分桶表
create table myhive.user_buckets_demo(id int, name string)
clustered by(id)
into 4 buckets
row format delimited fields terminated by '\t';
-- 创建普通表
create table user_demo(id int, name string)
row format delimited fields terminated by '\t';
③准备数据文件 buckets.txt
#在linux当中执行以下命令
cd /install/hivedatas/
vim user_bucket.txt
1 anzhulababy1
2 anzhulababy2
3 anzhulababy3
4 anzhulababy4
5 anzhulababy5
6 anzhulababy6
7 anzhulababy7
8 anzhulababy8
9 anzhulababy9
10 anzhulababy10
④加载数据到普通表 user_demo 中
load data local inpath '/install/hivedatas/user_bucket.txt' overwrite into table user_demo;
⑤加载数据到桶表user_buckets_demo中
insert into table user_buckets_demo select * from user_demo;
⑥hdfs上查看表的数据目录
⑦抽样查询桶表的数据
tablesample抽样语句语法:tablesample(bucket x out of y)
x表示从第几个桶开始做数据采样
y与进行采样的桶数的个数、每个采样桶的采样比例有关
select * from user_buckets_demo ;
需要采样的总桶数 = 分桶数/y = 结果ret
分两种情况
情况一:ret>1
需要采样的总桶数 = 分桶数/y = 4/2 = 2个
即从2个桶进行数据的采样
x = 1 先从第1个桶中取出数据
x+y = 1+2 = 3 再从第3个桶中取出数据
情况二:ret<1
假设还是此表user_buckets_demo,分桶数是4
x=1
y=8
∴需要采样的总桶数 = 分桶数/y = 4/8 = 0.5
ret<1,只能从1个桶进行数据的采样
x = 1 从第1个桶中取出0.5一半的数据