hive之分桶系列
一、分桶
- 定义
桶是对数据范围更细的划分。针对某一列进行桶的组织,对列值哈希,然后除以桶的个数求余,决定将该条记录存放到哪个桶中。 - 作用
1) 提高了查询速度
2) 使抽样(sampling)更高效
二、分桶表
- 创建分桶表
create table student_buckets
(id int ,name string)
clustered by (id) into 4 buckets //比普通建表多一个这个
stored as textfile;
- 开启分桶设置
set hive.enforce.bucketing=true;
- 加载数据
ps:分桶表的数据只能通过insert 的方式加载
insert into table student_buckets select id,name from student;
- 分桶抽样
1) 基于整行的随机抽样
SELECT * FROM table_name TABLESAMPLE(BUCKET x OUT OF y ON rand()) s;
解析:假设建表时分了a个桶
x:表示从第几桶开始抽数据
y:表示抽数据的比例,是抽数据的分母
表示从第x个桶,抽取的比例是 a/y
2)基于整列的随机抽样
SELECT * FROM table_name TABLESAMPLE(BUCKET x OUT OF y ON id) s;
3)基于block size的随机抽样
SELECT * FROM table_name TABLESAMPLE(10 PERCENT) s;//每一个块中提取10%数据
SELECT * FROM table_name TABLESAMPLE(1M) s;//每一个块中提取1M数据
SELECT * FROM table_name TABLESAMPLE(10 rows) s;//每一个块中提取前10行数据
三、分桶与分区的区别
分区是基于文件夹的操作,分出来时一个个的文件
分桶分的是文件,分出来是一个个的数据块