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