【博学谷学习记录】超强总结,用心分享 | hive分区与分桶的区别
【博学谷IT技术支持】
公众号: 积雷山摩云洞,欢迎关注!!!
概念
- 分区表: 将数据分散到多个子目录中,在执行查询是,可以根据条件加快查询效率
- 分桶表:是相对分区更细的颗粒度划分,分桶表是将表查分到不同的文件中,根据数据表某列的hash值进行分区,对某列数据分区就是对该列属性值的hash值取模,按照取模结果对数据分桶。
语句执行
分区表
分区表关键字段是partitioned by
,可以设置静态分区或者动态分区。静态分区直接将输入导入分区表,动态分区则通过创建普通表插入数据,将普通表的数据导入到分区表中
-- 分区表
-- partitioned by (字段名 类型) 分类的标准就是分区字段,可以一个,也可以多个。
drop table score;
create table score(
sid string,
cid string,
sscore int
)
partitioned by (dt string)
row format delimited fields terminated by '\t';
load data local inpath '/export/data/hivedatas/score.txt' into table score partition (dt='2022-10-24');
select * from score;
load data local inpath '/export/data/hivedatas/score2.txt' into table score partition (dt='2022-10-25');
select * from score where dt='2022-10-25';
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Eyk33RlZ-1669470016293)(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/14755951ed6e42829b09123a9b640635~tplv-k3u1fbpfcp-watermark.image?)]
分桶表
分桶表关键字段clustered by
,分桶表是通过创建普通表将普通表数据导入分桶表数据中
-- 分桶表
-- 开启hive的桶表功能
set hive.enforce.bucketing=true;
-- 设置reduce的个数
set mapreduce.job.reduces=3; -- #该参数在Hive2.x版本之后不起作用
create table course
(
cid string,
cname string,
tid string
)
clustered by (cid) into 3 buckets
row format delimited fields terminated by '\t';
-- 桶表的数据加载,由于桶表的数据加载通过hdfs dfs -put文件或者通过load data均不好使,
-- 只能通过insert overwrite
-- 创建普通表:
create table course_common
(
cid string,
cname string,
tid string
) row format delimited fields terminated by '\t';
-- 普通表中加载数据
load data local inpath '/export/data/hivedatas/course.txt' into table course_common;
select * from course_common;
-- 通过insert overwrite给桶表中加载数据
insert overwrite table course select * from course_common cluster by(cid);
select * from course;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FhnwYGa6-1669470016295)(https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/5e38c4c5276a4ae1aa34e1807874659d~tplv-k3u1fbpfcp-watermark.image?)]
总结
- 分区表:是一个或多个目录;使用
partitioned by
指定字段,指定字段为伪列,需要指定字段类型; 分区的个数可以增长; 分区表避免全表查询,根据指定字段提高了查询速度。 - 分桶表:是一个文件;使用
clustered by
,指定字段为真实字段,需要指定桶的个数; 分桶的个数一旦指定不能再增长; 分桶表在数据抽样和join时提高了MR程序效率。