最近做项目,hive表中导入数据时使用了一个之前没有见过的语法
set hive.exec.dynamic.partition.mode=nonstrict;
insert overwrite table dws_uv_detail_mn partition( mn)
select
mid,
...
....
date_format('2019-02-03','yyyy-MM')
from XXXX
这个insert语句的分区中没有设置具体的值,并且上面还有一个配置参数的语句,再文档中解释是动态分区的用法,一头雾水,在网上查资料,给了我很多思路的文档如下:
https://blog.csdn.net/pengzonglu7292/article/details/81326983
set hive.exec.dynamic.partition=true; 启动动态分区
set hive.exec.dynamic.partition.mode=nonstrict; 设置动态分区的模式为非严格模式
动态表在导入数据时,分区字段没有指定具体的值,可以通过select语句的最后一个字段来表示
select子句中必须包含动态分区表中的普通列和分区列,并且字段顺序必须要和动态分区表的建表字段顺序一致,最后一个字段必须是动态分区字段,这样就会自行根据dt的value来分区。
字段顺序的这种要求是因为默认情况下(mode=strick)不允许分区列全部是动态的,那主分区(二级分区时的第一级分区是主分区)采用必须是静态列。但是通过设置参数(mode=nostrick)实现所有的分区列都是动态分区列,即可以根据select中的值来推断每个分区的值
写到这,忽然明白,动态分区,动态分区说的就是没有固定值的分区方式,之前insert数据时都是明确分区字段等于什么值的,但是大量复杂的数据可以使用动态分区将数据按照指定的格式再次整理
看来,遇到一个专业名词的时候要先往字面意义上想一下