案例
气象站的气温数据,根据年份分区之后,还要根据月份分区,还要根据日期分区,分区较多
将数据上传到表中,手动去指定分区显然是不现实的
此时就用到 动态分区表
动态分区表
动态分区表,往表中插入数据的时候,动态的根据 值,将数据放入各个的分区中,不需要指定分区,如:
INSERT into table user_article(uid,aid,`date`) values (103,1634,'20200108');
会自动在 hdfs 上创建目录
与静态分区表区别
静态分区表需要先添加分区,插入数据 时要 指定分区,如:
insert into user_article partition(`date`='20200101' ) (uid,aid) values ('10','1002')
创建表
与 静态分区表相同
默认 创建的就是 动态分区表
create table user_article3(
uid int,
aid int
)
partitioned by (
`date` string
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
查看是否动态分区表
set hive.exec.dynamic.partition
执行结果如下:
hive.exec.dynamic.partition=true
说明是动态分区表
设置 全局动态分区
set hive.exec.dynamic.partition=true;
严格模式 和 非严格模式
默认动态表是 非严格模式,执行 HSQL 更加宽松
严格模式,有些 HSQL 语句不支持
严格模式
开启动态分区
set hive.exec.dynamic.partition=true;
设置严格模式
set hive.exec.dynamic.partition.mode = strict;
下面sql能够正确执行
INSERT into table user_article3(uid,aid,`date`) values (103,1634,'20200108');
下面sql报错
insert into table user_article3 partition(`date`) (uid,aid,`date`) values ('200','2001','20200106')
多个动态字段
严格模式下,至少有一列是静态,静态的意思是:指定分区
insert into table user_article3 partition(`date`='20200103',`hour`) (uid,aid,`hour`) values ('200','2001','12');
非严格模式
开启动态分区
set hive.exec.dynamic.partition=true;
设置非严格模式
set hive.exec.dynamic.partition.mode = nonstrict;
插入数据时,可根据分区字段的值,自动进行分区、创建hdfs上目录
INSERT into table user_article3(uid,aid,`date`) values (103,20001,'20200108');
下面sql也能够运行
insert into table user_article3 partition(`date`) (uid,aid,`date`) values ('200','2001','20200106')
参考博文:
https://blog.csdn.net/weixin_43614067/article/details/108637441
https://www.cnblogs.com/shaoyayu/p/13434274.html
https://blog.csdn.net/weixin_39182877/article/details/79119004