桶表的介绍
对于每一个表(table)或者分区,Hive 可以进一步组织成桶,也就是说,桶时更为细粒度的数据范围划分。Hive 也是针对某一列进行桶的组织。Hive 采用对列值哈希,然后除以桶的个数求余的方式决定记录存放在哪个桶当中。
把表或者分区组织成桶有两个理由:
(1)或者更高的查询处理效率。桶表为表加上了额外的结构,Hive在处理有些查询时能利用这个结构。具体而言,连接两个在(包含连接列)相同列上划分了桶的表,可以使用Map 端链接 ( Map-side join )高效的实现。比如join操作,对于join操作两个表有一个相同的列,如果对着两个表都进行了桶操作。那么将保存相同列值的桶进行join操作就可以,可以大大减少join数据量。
(2)使取样(sampling)更高效。在处理大规模数据集时,在开发和修改查询的阶段,如果能在数据集的一小部分数据上试运行查询,会带来很多方便。
-- 设置分桶机制开启
set hive.enforce.bucketing=true;
set mapreduce.job.reduces=4;
-- 清空表数据
truncate table stu_buck;
create table stu_buck( Sno int,Sname string,Sex string,Sage int,Sdept string )
clustered by (Sno)
sorted by (Sno DESC)
into 4 buckets
row format delimited
fields terminated by ',';
-- 切记桶表加载数据不能使用 load方式,可以使用如下方式 从已有数据表中抽取
insert overwrite table stu_buck select * from stu_buck_ext distribute by sno sort by sno desc;
桶表的使用技巧
-- 抽样调查
select * from stu_buck tablesample (bucket 1 out of 4 on sno);
语法:TABLESAMPLE(BUCKET x OUT OF y)
y必须是table总bucket数的倍数或者因子。hive根据y的大小,决定抽样的比例.
如,table总共分了64份,当y=32时,抽取(64/32=)2个bucket的数据,当y=128时,抽取(64/128=)1/2个bucket的数据。x表示从哪个bucket开始抽取。例如,table总bucket数为32,tablesample(bucket 3 out of 16),表示总共抽取(32/16=)2个bucket的数据,分别为第3个bucket和第(3+16=)19个bucket的数据。