Hive_桶表(三)

桶表的介绍

对于每一个表(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的数据。

发布了33 篇原创文章 · 获赞 3 · 访问量 5868

猜你喜欢

转载自blog.csdn.net/WandaZw/article/details/82796670
今日推荐