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