1. 为什么要使用桶表???
- 单个分区或者表中的数据量越来越大,当分区不能更细粒的划分数据时,所以会采用分桶技术将数据更细粒度的划分和管理。
- 分区提供了一个隔离数据和优化查询的便利的方式.但是当分区的数量过多时,会产生过多的小分区,这样会给namenode带来较大的压力.分桶是将数据集分解成更容易管理的若干部分的另一个技术。
2. 桶表分桶规则
- 个人理解桶表的分桶类似于MapReduce的默认分区规则–HashPartitioner差不多,桶表的分区则是通过分桶的字段进行Hash然后除以桶的个数,然后取余数,余数决定数据是在哪个桶内。
- 桶表本质上面并不会改变目录结构,桶表输出的文件个数等于桶的数量。
3. 桶表的创建
3.1 DLL
create table score_bucket (
`year` int,
`course` string,
`student` string,
`score` int
)
comment 'score 分桶表'
clustered by (year) sorted by (score desc) into 3 buckets
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';
3.2 数据
2018,语文,A,67
2018,英语,A,56
2018,数学,A,69
2018,语文,B,67
2018,英语,B,72
2018,数学,B,56
2019,语文,A,72
2019,英语,A,51
2019,数学,A,83
2019,语文,B,53
2019,英语,B,70
2019,数学,B,52
2020,语文,A,75
2020,英语,A,60
2020,数学,A,90
2020,语文,B,60
2020,英语,B,80
2020,数学,B,70
3.3 DML
hive> set hive.strict.checks.bucketing=false;
hive> load data local inpath '/home/work/data/hive/score.txt' overwrite into table score_bucket