一、前言
Hive分区是为了方便数据管理
Hive的分区方式:由于Hive实际是存储在HDFS上的抽象,Hive的一个分区名对应一个目录名,子分区名就是子目录名,并不是一个实际字段。
所以可以这样理解,当我们在插入数据的时候指定分区,其实就是新建一个目录或者子目录,或者在原有的目录上添加数据文件。
二、Hive分区的创建
Hive创建分区时,是通过PARTITIONED BY关键字进行创建,要注意的是这个关键字定义的列是表中正式的列,不能与表中其他列名重复,但是Hive下的数据文件不包含这些列,他们是目录(分区)名,目录下放的才是数据。
三、静态分区
3.1 单分区
3.1.1 创建静态分区表
创建成功
分区字段不能与表中其他字段重复 否则会报错 ↓ ↓ ↓
这个时候我们desc查看一下表结构
3.1.2 向表中装载数据
数据如下:
执行load 装载数据(其实load操作相当于把文件移动到HDFS的Hive目录下)
加载成功
3.1.3 查看表的数据
3.1.4 查看表的分区
web界面
可以看到,在新建分区表的时候,系统会在hive数据仓库默认路径/user/hive/warehouse/下创建一个目录(表名),再创建目录的子目录part=p1(分区名),最后在分区名下存放实际的数据文件(load加载进表的文件)。
我们在加载一组数据到新的分区去
加载数据到新的part2分区
此时表里的数据:
表的分区:
web界面
3.2 多分区
3.2.1 创建多分区表
分区逻辑大致是 部门分区下有性别分区 目录:dept/sex
创建成功!!
3.2.2 加载数据到表中
分区字段都要加,否则会报错FAILED: SemanticException [Error 10006]: Line 1:88 Partition not found ”0”
3.2.3 查询表中数据
可以看出分区关系,前面是大分区,大分区中有两个小分区,数据在不同的小分区上
看web界面会更明了
四、动态分区
如果用上述的静态分区,插入的时候必须首先要知道有什么分区类型,而且每个分区写一个load data,太烦人。使用动态分区可解决以上问题,其可以根据查询得到的数据动态分配到分区里。其实动态分区与静态分区区别就是不指定分区目录,由系统自己选择。
首先,启动动态分区功能
注意,动态分区不允许主分区采用动态列而副分区采用静态列,这样将导致所有的主分区都要创建副分区静态列所定义的分区。
动态分区可以允许所有的分区列都是动态分区列,但是要设置一个参数hive.exec.dynamic.partition.mode :
我们以多分区为例,单分区则更加简单
我们首先有一个表的数据 以我们的table2为例。
我们重新复制一个与table2表结构一模一样的表table3 利用like关键字
现在我把table2的内容直接插入到另一张表table3中, (不指定到底是那个部门和性别,让系统分配)
未指定分区
查看表数据
对照table2分区信息,完全符合 证明动态分区成功!!
五、表分区的增删改查
5.1 添加分区
5.2 删除分区
删除相应的分区,该分区的内容也会消失
5.3 查询分区
5.4 修复分区
修复分区就是重新同步hdfs上的分区信息。