t
thatdaniel
V1
2022/11/06阅读:21主题:默认主题
Hive -分区&分桶
Hive -分区&分桶
1. 分区表
1.1 分区表的意义
-
避免hive全表扫描,提升查询效率;
-
减少数据冗余进而提高特定(指定分区)查询分析的效率;
-
在逻辑上分区表与未分区表没有区别,在物理上分区表会将数据按照分区键的列值存储在表目录的 子目录中,目录名为“分区键=键值”;
-
查询时尽量利用分区字段。如果不使用分区字段,就会全部扫描。
1.2 分区表类型
静态分区与动态分区的主要区别在于静态分区是手动指定,而动态分区是通过数据来进行判断
create table emp_partition(emp_no bigint,
first_name string,
last_name string,
gender string,
birth_date date,
from_date date)
partition by (dept_name string)
row format delimited
fields terminated by '\t' -- 字段分隔符
-- 添加分区(相当于创建一个文件夹)
alter table emp_partition add partition(dept_name='Finance')
show create table emp_partition -- 查看表结构
show partitions emp_partition
分区展示效果:

2. 分桶
背景: 单个分区或者表中数据量越来越大,**当分区不能更细粒度划分数据时,采用分桶技术将数据更细力度的划分和管理 **
实质: 分桶是对分桶字段做hash 然后存到对应的文件中
作用:1. 提高join 查询效率(表A的每个桶就可以和表B对应的桶直接join,而不用全表join) 2. 方便抽样
create table emp_bucket (
emp_no bigint,
first_name string,
last_name string,
gender string,
birth_date date,
from_date date,
dept_name string
)
clustered by(gender) into 2 buckets -- 按照性别分桶,使用建表语句存在的字段分桶
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t';
3. 创建外部表
外部表创建需要手动指定表位置
create external table emp_external -- 此处前加一个external
(emp_no bigint,
first_name string,
last_name string,
gender string,
birth_date date,
from_date date,
dept_name string)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
location '/user/admin/external_table/emp_external'; -- 指定位置
外部表&内部表区别:
内部表 | 外部表 | |
---|---|---|
关键字 | external | |
位置 | 默认 | Location 指定 |
数据 | Hive自身管理(删除表直接删除元数据、存储数据) | HDFS管理(删除表仅会删除元数据,存储数据并不会被删除) |
关于数据管理删除
drop table emp_bucket -- 此处会删掉整个表结构数据
drop table emp_external -- 此处只删除,即表还在但是数据被删除数据,存储数据并不会被删除,即表还在但是数据被删除
作者介绍
t
thatdaniel
V1