分桶及抽样查询
分桶表数据存储类似与MR分区
分区针对的是数据的存储路径;分桶针对的是数据文件。
分区提供一个隔离数据和优化查询的便利方式。不过,并非所有的数据集都可形成合理的分区,
特别是之前所提到过的要确定合适的划分大小这个疑虑。
分桶是将数据集分解成更容易管理的若干部分的另一个技术。
建表:
create table stu_buck(id int, name string)
clustered by(id) into 4 buckets
row format delimited fields terminated by '\t';
desc formatted stu_buck;
![Snipaste_2020-06-09_11-08-30.png](https://img.haomeiwen.com/i6334897/6de72852ab6f5d66.png?imageMogr2/auto-[图片上传中...(Snipaste_2020-06-09_11-12-11.png-464c67-1591688110841-0)]
orient/strip%7CimageView2/2/w/1240)
load导入数据,发现未生产四个桶
load data local inpath '/home/data/stu.txt' into table stu_buck;
Snipaste_2020-06-09_11-12-11.png
清空桶表
truncate table stu_buck;
导入数据之前,需要先设置参数
set hive.enforce.bucketing=true;
set mapreduce.job.reduces=-1; //自动根据桶的个数决定业务的个数
insert into table stu_buck
select id, name from stu;
Snipaste_2020-06-09_11-19-08.png
Snipaste_2020-06-09_11-19-18.png
分桶抽样查询
对于非常大的数据集,有时用户需要使用的是一个具有代表性的查询结果而不是全部结果。Hive 可以通过对表进行抽样来满足这个需求。
select * from stu_buck tablesample(bucket 1 out of 4 on id);
注:tablesample 是抽样语句,语法:TABLESAMPLE(BUCKET x OUT OF y) 。
y 必须是 table 总 bucket 数的倍数或者因子。hive 根据 y 的大小,决定抽样的比例。
例如,table 总共分了 4 份,当 y=2 时,抽取(4/2=)2 个bucket 的数据,当 y=8 时,抽取(4/8=)1/2 个 bucket 的数据。
x 表示从哪个 bucket 开始抽取,如果需要取多个分区,以后的分区号为当前分区号加上y。
例如,table 总 bucket 数为 4,tablesample(bucket 1 out of 2),表示总共抽取(4/2=)2 个bucket 的数据,抽取第 1(x)个和第 3(x+y)个 bucket 的数据
注意:x 的值必须小于等于 y 的值,否会报错
Snipaste_2020-06-09_15-28-14.png
网友评论