先把大家都知道的分桶抽样查询 的语法以及用法po出
select * from 分桶表 tablesample(bucket x out of y on 分桶字段);
假设当前分桶表,一共分了z桶!
x: 代表从当前的第几桶开始抽样
0<x<=y
y必须是z的因子或倍数!
怎么抽: 从第x桶开始抽,当y<=z每间隔y桶抽一桶,直到抽满 z/y桶
举例1:
select * from stu_buck2 tablesample(bucket 1 out of 2 on id);
从第1桶开始抽,每间隔2桶抽一桶,一共抽2桶!
桶号: x+y*(n-1) 抽0号桶和2号桶
举例2:
select * from stu_buck2 tablesample(bucket 1 out of 1 on id);
从第1桶开始抽,每间隔1桶抽一桶,一共抽4桶!
抽0,1,2,3号桶
举例3:
select * from stu_buck2 tablesample(bucket 2 out of 8 on id);
从第2桶开始抽,一共抽0.5桶!
抽1号桶的一半
然而,当我自己实验时,发现实际情况跟预期有偏差
建表语句:
--创建分桶表 create table people (id int,name string) clustered by (id) sorted by (name desc) into 4 buckets row format delimited fields terminated by ' '; --创建临时表 create table tmp (id int,name string) row format delimited fields terminated by ' '; --加载数据 load data local inpath '/home/guigu/data.txt' into table tmp; --加载数据到分桶表 insert overwrite table people select * from tmp;
数据:
1 jake 1 mike 2 ace 3 luffey 4 namy 5 franky 2 zoro 3 sanji 4 usoop 3 kapu 2 jinx 1 jake1 1 mike1 2 ace1 3 luffey1 4 namy1 5 franky1 2 zoro1 3 sanji1 4 usoop1 3 kapu1 2 jinx1 6 usoop4 7 kapu4 8 jin3 9 jake5 6 mike2 7 ace4 8 luffey3 9 namy5 6 franky2 7 zoro3 8 sanji5 9 usoop5 6 kapu4 7 jinx2 8 kap 9 jin
分好的桶如下
然而查询时却发现 本来打算取第2个桶里的4/8 数据,但返回的数据跟预期差得很多
其实
select * from 分桶表 tablesample(bucket x out of y on 分桶字段);
这个抽样查询的底层是把所有数据按照 字段的hash值 % y 分成y 个 区(相当于Hadoop里的分区),然后取第 x 区 中的数据。
之所以没有达到预期的效果,是因为用来测试的数据太少!