Hive如果需要创建非常多的分区,那么用户就需要写很多的SQL,Hive提供了一个动态分区功能,其可以基于查询参数推断需要创建的分区名称
INSERT OVERWRITE TABEL employee
PARTITION(country,state)
SELECT .......se.cnty,se.st
FROM staged_employee se;
hive根据select语句中最后2列来确定分区字段country和state的值
用户也可以使用动态分区和静态分区
INSERT OVERWRITE INTO TABLE employee
PARTITION (country = 'US',state)
SELECT ......se.cnty ,se,st
FROM staged_employee se
WHERE se.cnty='US'
静态分区必须出现在动态分区之前
动态分区功能默认情况下是没有开启的。开启后,默认是以"严格"模式执行的,这这种模式下要求至少有一列分区字段是静态的。
设置如下参数开启动态分区:
hive.exec.dynamic.partition=true
默认值:false描述:是否允许动态分区
hive.exec.dynamic.partition.mode=nonstrict
默认值:strict描述:strict是避免全分区字段是动态的,必须有至少一个分区字段是指定有值的
设置如下参数配置动态分区的使用环境:
hive.exec.max.dynamic.partitions.pernode=100
默认值:100描述:each mapper or reducer可以创建的最大动态分区数
hive.exec.max.dynamic.partitions=1000
默认值:1000描述:一个DML操作可以创建的最大动态分区数
hive.exec.max.created.files=100000
默认值:100000描述:一个DML操作可以创建的文件数
设置如下参数取消一些限制(HIVE 0.7后没有此限制):
hive.merge.mapfiles=false
默认值:true描述:是否合并Map的输出文件
hive.merge.mapredfiles=false
默认值:false描述:是否合并Reduce的输出文件