1. 源表建立
Create external table 源表(
字段 类型,
字段 类型,
id int comment '分桶字段'
)row format delimited
Fields terminated by ','
Location '上传的表存放的路径';
2. 创建分桶表
Create external table 分桶表(
字段 类型,
字段 类型,
id int comment '分桶字段'
)
clustered by (分桶列名id) sorted by (列1 , 列2) into n(桶数) buckets
row format delimited
Fields terminated by ','
Location '上传的表存放的路径';
加载源数据:
load data local inpath 'linux文件地址' into table 源表;
load data inpath 'HDFS文件地址' into table 源表;
加载分桶数据 :
insert into 分桶表名 select ... from 源表 where 条件;
3. 分桶表的多表关联
select * from bucket_1 b1 join bucket_2 b2 on b1.分桶字段=b2.分桶字段
两张分桶表关联,其各自分桶的列必须是可作连接条件的列;
分桶的个数之间相除为整数:N1/N2=整数;
4. 分桶分区表
4.1 创建分桶分区源表
Create external table 源表(
字段 类型,
字段 类型,
列1 int comment '分桶字段1',
列2 int comment '分桶字段2',
dt date comment '分区字段'
)row format delimited
Fields terminated by ','
Location '上传的表存放的路径';
4.2 创建分桶分区表
Create external table 源表(
字段 类型,
字段 类型,
列1 int comment '分桶字段1',
列2 int comment '分桶字段2'
)
partition by (dt date)
clustered by (分桶列名id) sorted by (列1 , 列2) into n(桶数) buckets
row format delimited
Fields terminated by ','
Location '上传的表存放的路径';
4.3 加载数据
insert into 分桶分区表 partition (dt分区字段)
select 分桶分区表所需字段(...列1,列2)+分区字段(dt)
from 源表;
5. 分桶抽样
5.1 普通表
select * from 普通表 tablesample(bucket 3 out of 6 on id)
要第3桶的桶数据,桶号值分别为桶0、1、2、3、4....因此第3桶的桶号为2
获取的抽样数据为:id % 6 = 2 的id值所在行
5.2 分桶表
select * from 分桶表 tablesample(bucket 3 out of 6 on id)
假设分桶表共有24个桶,此时6要为24的因数
要第3桶的桶数据,桶号值分别为桶0、1、2、3、4....因此第3桶的桶号为2
24/6=4 表示要在24个桶中抽取4个桶的数据
抽取的四个桶的桶号分别为 (24个桶的桶号) % 6 = 2
例如:0 % 6=0 1%6=1 2%6=2 3%6=3 4%6=4 5%6=5 6%6=0 7%6=1 8%6=2 ......
因此抽取的桶的序号为2、8、14、20
因为桶的序号从0开始算起的,因此拿取的桶为第3、9、15、21的桶里面的数据
分桶表抽取数据要比普通表抽取数据更快,因为普通表是匹配每一行的id,分桶表只需要匹配桶号即可拿出数据