分桶的场景:有的数据不适合形成合理的分区,尤其是需要确定合适大小的分区(分区之后,有的分区内数据量特别大,有的分区中数据量很小),分桶是将数据细粒度划分的另一个技术
create table tb_cluster(
udate string,
name string,
cost int,
yue double
)
clustered by(cost) ------>注意此处不要少了小括号!分桶的字段为数据已知字段
sorted by (name desc) into 4 buckets ------>注意此处不要少了小括号!排序的字段也为数据已知字段
row format delimited fields terminated by '\t';
set hive.enforce.bucketing=true; |
打开分桶 |
set mapreduce.job.reduces=-1; |
设置自动分区 |
insert into table tb_cluster select utime,name,cost,yue from tmp;
分桶的原理:
和mapreduce中的hashPartitioner的原理一样,
将分桶字段的hash值和分桶个数取余,余数为几就放入几号桶
分桶的作用:
1、分桶可以将数据进行抽样分析
2、可以提高join的查询效率,如果两个互相join的表都进行了分桶,可以使用map端join,保存相同列值的桶进行join,可以减少join的数据量
抽样查询语法:
TABLESAMPLE(BUCKET x OUT OF y)?
假如有z个桶,从第x桶开始抽样,每隔y桶抽一桶,直到抽满z/y桶为止
4个桶,tablesample(bucket 1 out of 4) : 从第1桶开始抽,一共抽了1桶
4个桶,tablesample(bucket 1 out of 2) : 从第1桶开始抽,每隔2桶抽1桶,一共抽了2桶
4个桶,tablesample(bucket 1 out of 8) : 从第1桶开始抽,一共抽了0.5桶
4个桶,tablesample(bucket 2 out of 2) : 从第2桶开始抽,一共抽了2桶
select * from stu_buck tablesample(bucket 1 out of 4 on id);
建一张表,按照年、月二级分区,按照cost分桶
静态分区 + 分桶插入数据
动态分区 + 分桶插入数据
动静结合 + 分桶插入数据
静态分区 + 分桶插入数据:
insert into table clusterPar partition(uyear='2021',umonth='04') select utime,name,cost,yue from tmp where year(utime)='2021' and substring(utime,6,2)='04';
动态分区 + 分桶插入数据:
insert into table clusterPar partition(uyear,umonth) select utime,name,cost,yue,year(utime) uyear,month(utime) umonth from tmp;
动静结合 + 分桶插入数据:
insert into table clusterPar partition(uyear='2020',umonth) select utime,name,cost,yue,month(utime) umonth from tmp where year(utime)='2020';