文章目录
- 1. 分区表概念
- 2. 分区表语法
- 3. 分区表加载数据
- 3.1 静态分区
- 3.2 多重分区
- 3.3 动态分区
- 3.4 注意事项
1. 分区表概念
当Hive表对应的数据量大、文件个数多时,为了避免查询时全表扫描数据,Hive支持根据指定的字段对表进行分区,分区的字段可以是日期、地域、种类等具有标识意义的字段。(因为HDFS是分布式文件存储系统,我们所看见的“表”的数据,很有可能来自好几个文件,这几个文件可能就是按照某个维度分好类的,只是我们在“表”中看见的是全部数据)
2. 分区表语法
分区字段不能是表中已经存在的字段,因为分区字段最终也会以虚 拟字段的形式显示在表结构上。
create table table_name(column1 data_type,column2 data_type,···
)partitioned by(partition1 data_type,partition2 data_type,...);
3. 分区表加载数据
3.1 静态分区
用户在加载数据时手动指定,分区表实际上在底层管理数据方式发生了改变。每一个分区字段值作为文件夹名,该文件夹里面存放文件。
load data [local] inpath 'filepath'into table tablename partition(分区字段='fenquzhi'...);
- 分区的概念提供了一种将Hive表数据分离为多个文件/目录的方法。
- 不同分区对应着不同的文件夹,同一分区的数据存储在同一个文件夹下。
- 查询过滤的时候只需要根据分区值找到对应的文件夹,扫描文件夹下本分区的文件即可。
- 这种指定分区查询的方式叫做分区裁剪。
3.2 多重分区
Hive支持多个分区字段partitioned by (partition1 data_type,partition2 data_type,...)
,多重分区下,分区之间是一种递进关系,可以理解为在前一个分区的基础上继续分区。从HDFS的角度来看,就是文件夹下继续划分子文件夹。
3.3 动态分区
动态分区指的是分区的字段值是基于查询结果(参数位置)自动推断出来的,核心语法就是inssert+select,启用Hive动态分区,需要在Hive会话中设置两个参数:
# 是否开启动态分区功能
set hive.exec.dynamice.partition=true;
# 指定动态分区模式,分为nonstick非严格模式和strict严格模式
# strict严格模式要求至少有一个分区为非静态分区
set hive.exec.dynamice.partition.mode=nonstrict;
3.4 注意事项
- 分区表不是建表必要语法规则,是一种优化手段表,可选。
- 分区字段不能是表中已有字段,不能重复。
- 分区字段是虚拟字段,其数据并不存储在底层文件中。
- 分区字段值的确定来自于用户手动指定(静态分区)或者根据查询结果位置自动推断(动态分区)。
- Hive支持多重分区,也就是说在分区的基础上继续分区,划分更加细的粒度。