分桶表意义:
1、为了抽样
2、为了提高连接、查询效率
体现如下:1、数据定位,分桶表通过哈希算法,把数据分散到不同桶中,在进行查询时可以根据查询条件的哈希值快速定位到要查询的桶中。2、并行处理:桶之间是独立的存储单元,可以并行访问处理,在查询是,可以并行访问多个桶,提高查询效率。3、分桶表数据分布均衡
规则
按照分桶字段 哈希值 除以分桶数 取余
语法
创建
create table tb_bucket_9 (
id int,
name string,
story_id int
)
clustered by (story_id) into 9 buckets --不带排序
clustered by (story_id) sorted by (story_id) into 9 buckets --带排序
抽样
select * from 表名 tablesample(bucket x out of y on 列)
y决定要几桶 num=表的桶数/y
x决定要第几桶
select * from tb_bucket_9 tablesample ( bucket 3 out of 3 on story_id);--num=9/3 一共抽三桶,分别是第3、6、9桶
select * from tb_bucket_9 tablesample ( bucket 1 out of 18 on story_id);--num=9/19 一共抽1/2桶,在第一桶中
提高连接效率
1、map join优化,适用于大表和小表关联,把小表放到内存里,在map端就开始join,缓解reduce压力
2、bucket map join优化,适用于一个表的bucket数 是另一个表bucket数的整数倍。将两个表都按照相同的分桶字段进行分桶,然后将每个桶加载到内存中进行关联操作。
3、sort merge bucket map join优化,smb map join的适用场景是在一个大表和一个或多个小表进行关联查询,并且大表的数据可以分区且可以排序,排序后放入内存,小表根据关联字段在大表分区中进行二分查找