1.简介
分桶表是对列值取哈希值的方式将不同数据放到不同文件中进行存储。对于hive中每一个表,分区都可以进一步进行分桶。由列的哈希值除以桶的个数来决定数据划分到哪个桶里。
2.适用场景
1.数据抽样【sampling】
2.map-join
3.开启支持分桶
配置;set hive.enforce.bucketing=true;
默认值:false
设置为true后,mapreduce运行时会根据bucket的个数自动分配reduce task个数
注意:首次作业产生的桶【文件个数】和reduce task个数一致。
4.加载数据
执行:
insert into table bucket_table select columnd from tbl;
insert override table bucket_table select columns from tbl;
5.抽样
执行:
select * from bucket_table tablesample(bucket 1 out of 4 on columns);
语法: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的数据。
6.创建分桶表
执行:
create table psnbucket(id INT,name STRING,age INT) clustered by (age) into 4 buckets row format delimited fields terminated by ',';