前言
1、Hive分区的概念与传统关系型数据库分区不同。
2、传统数据库的分区方式:如oracle,分区独立存在于字段,里面存储真实的数据,在数据进行插入的时候自动分配分区。
3、Hive的分区方式:Hive实际是存储在HDFS上的抽象,Hive的一个分区名对应一个目录名,子分区名就是子目录名,并非一个实际字段。
即,当在插入数据的时候指定分区,其就是新建一个目录或者子目录,或者在原有的目录上添加数据文件。
动态分区和静态分区(Hive-0.14以后的特性)
1、动态分区:分区不固定;关键在于“动态”,不需要人为使用 alter table 命令执行添加分区
2、静态分区:分区固定,需要认为使用 alter table 命令添加分区
最大区别:动态分区与静态分区区别就是不指定分区目录,由系统自己选择。
举例
1、静态分区表
创建学生表,以city 分区
create table t_student (name string,age int) partitioned by (city string) row format delimited fields terminated by '\t' STORED AS TEXTFILE;
准备本地数据文件 t_student.txt,内容 “名字/年龄”,将以城市(city)作为分区,以\t 分割字段
cassie 20
luck 20
tom 22
lazy 20
room 29
jef 23
把数据插入到 t_student 表中(实际上 load 操作相当于把文件移动到HDFS的Hive目录下)
load data local inpath '/home/hdfs/hive/t_student.txt' into table t_student partition (city='beijing');
查询 t_student 表数据,发现有 3列,分别是 name,age,city
select * from t_student;
查询hdfs 目录
2、动态分区表
问题一:如果用静态分区,那么在插入的时就必须要先知道分区类型,且每个分区写一个load data或者 alter table 。
解决方法:使用动态分区,可简化问题,可以根据查询得到的数据动态分配到分区里。
1) 启用动态分区
set hive.exec.dynamic.partition=true;
查看当前状态
2)创建2个表(t_people、t_teacher)
有分区字段:city,dt_time
create table t_people (name string,age int) partitioned by (city string,dt_time int) row format delimited fields terminated by '\t' STORED AS TEXTFILE;
create table t_teacher (name string,age int) partitioned by (city string,dt_time int) row format delimited fields terminated by '\t' STORED AS TEXTFILE;
先往 t_teacher 中插入数据
insert into table t_teacher partition(city='beijing',dt_time=20190301) select name,age from t_student;
insert into table t_teacher partition(city='tianjin',dt_time=20190302) select name,age from t_student;
再测试使用动态分区的插入语句
insert overwrite table t_people partition(city='hongkong',dt_time) select name, age, dt_time from t_teacher;
发现t_people表会根据 dt_time 列的值自动分区了!
hdfs 目录
注意
1、动态分区不允许主分区采用动态列而副分区采用静态列,目的是为了避免所有的主分区都要创建副分区静态列所定义的分区。
2、动态分区可以允许所有的分区列都是动态分区列,但是要首先设置一个参数
set hive.exec.dynamic.partition.mode=nonstrict;
hive.exec.dynamic.partition.mode 的默认值是strict,即不允许分区列全部是动态的,目的是为了防止用户有可能原意是只在子分区内进行动态建分区。
参考
https://cwiki.apache.org/confluence/display/Hive/DynamicPartitions
以上仅供参考,如有不足之处,请批评指正!