一、为什么要分区和分桶
1.1 为什么要分区
随着系统运行时间增长,表的数据量会越来越大,而hive查询时通常是全表扫描,这样将导致大量的不必要的数据被扫描,从而大大提高查询效率。从而引进分区技术,可以将用户的整个表的数据在存储时划分为多个子目录,从而在查询时可以指定查询条件(子目录以分区变量的值来命名)eg:filedate=‘20210810’。
1.2 为什么要分桶
单个分区或者表中的数据量越来越大,当分区不能更细粒的划分数据时,需要采用分桶技术将数据更细粒度的划分和管理。从而引进分桶技术,分桶更多地用来做数据抽样、JOIN操作。
分区是分目录,分桶是分文件。
二、分区
2.1 怎么分区
根据业务,通常按照年、月、日、地区等
2.2 分区的技术
PARTIONED BY(col_name data_type)
- hive的分区字段使用的是表外字段。而mysql使用的是表内字段。
- hive的分区名区分大小写
- hive的分区本质是在表目录下面创建目录,但是该分区字段是一个伪列,不真实存在于数据中
- 一张表可以有一个或者多个分区,分区下面也可以有一个或者多个分区
2.3 分区的意义
可以让用户在做数据分析统计时缩小数据扫描的范围,提高查询效率。因为可以在select时指定要统计的分区,提高查询效率。eg:select * from bus_gps where filedate = 20210810;
2.4 创建分区表
一级:
create table if not exists consumers1(
uid int,
uname string,
uage int
)
PARTITIONED BY (country string)
row format delimited
fields terminated by ','
;
分区表导入数据的方式:
load data local inpath '/usr/local/xxx' into table consumers1
partition(country='China'); #要指定分区
select * from part1 where country='China';
二级:
create table if not exists consumers2(
uid int,
uname string,
uage int
)
PARTITIONED BY (year string,month string)
row format delimited
fields terminated by ','
;
load data local inpath '/usr/local/xxx' into table consumers2
partition(year='2021',month='08');
load data local inpath '/usr/local/xxx' into table consumers2
partition(year='2021',month=08);
select * from consumers2 where year='2021',month='08';
三级:
create table if not exists consumers3(
uid int,
uname string,
uage int
)
PARTITIONED BY (year string,month string,day string)
row format delimited
fields terminated by ','
;
load data local inpath '/usr/local/xxx' into table consumers3
partition(year='2021',month='08',day='10');
load data local inpath '/usr/local/xxx' into table consumers3
partition(year='2021',month=08,day='10');
select * from consumers3 where year='2021',month='08',day='10';

本文详细介绍了Hive中的分区与分桶技术,包括分区的目的、方式和技术,以及分桶的意义和实现方法。分区通过目录结构减少数据扫描,提高查询效率,而分桶则进一步细化数据组织,用于数据抽样和JOIN操作。创建和管理分区涉及ALTER TABLE语句,动态分区需设置相关属性。分桶使用CLUSTERED BY关键字,确保数据分布均匀。分区与分桶结合使用能更好地优化大数据处理。
最低0.47元/天 解锁文章
1257

被折叠的 条评论
为什么被折叠?



