之前说过分区表,分区都是用SQL语句创建的,那么如果需要创建非常多的分区,用户就需 要写非常多的SQL吗?也不是的 ,Hive提供了一个动态分区功能,其可以基于查询 参数推断出需要创建的分区名称。
仔细看这个例子
INSERT OVERWRITE TABLE dwd_loginPARTITION (year,day)SELECT ...,year,day FROM ods_login
Hive根据SELECT语句中最后2列来确定分区字段year,month的值。需要注意的是,字段名字不重要,重要的是位置!是位置!是位置!
假设表 ods_login中共有一年数据的话个国家和州的话,执行完上面这个查询后,表 dwd_login就将会有365个分区!
用户也可以混合使用动态和静态分区。如下这个例子中指定了year字段的值为静态的'2020',而分区字段day是动态值:
INSERT OVERWRITE TABLE dwd_loginPARTITION (year='2020',day)SELECT ...,year,day FROM ods_login where year='2020'
注意静态分区键必须出现在动态分区键之前。动态分区功能默认情况下没有开启。开启后,默认是以“严格”模式执行的,在这种 模式下要求至少有一列分区字段是静态的。
这有助于阻止因设计错误导致查询产生大 量的分区。例如,用户可能错误地使用时间戳作为分区字段,然后导致每秒都对应一 个分区!而用户也许是期望按照天或者按照小时进行划分的。还有一些其他相关属性 值用于限制资源利用。
- hive.exec.dynamic.partition
缺省值:false
设置成true,表示开启动态分区功能
- hive.exec.dynamic.partition.mode
缺省值:strict
设置成ncmstrict,表示允许所有分区都是动态的
- hive.exec.max.dynamic.partitions. pemode
缺省值:100
每个mapper或reducer可以创建的最大动态分 区个数。如果某个mapper或reducerr尝试创建 大于这个值的分区的话则会抛出一个致命错误 信息
- hive.exec.max.dynamic.partitions
缺省值:1000
一个动态分区创建语句可以创建的最大动态分 区个数。如果超过这个值则会抛出一个致命错 误信息
- hive.exec.max.created.files
缺省值:100000
全局可以创建的最大文件个数。有一个Hadoop 计数器会跟踪记录创建了多少个文件,如果超过 这个值则会抛出一个致命错误信息
因此,上面那个例子不是在任何Hive环境下都可以执行的,需要加上这些配置:
hive> set hive.exec.dynamic.partition=true;hive> set hive. exec. dynamic .partition .mode=nonstrict;.hive> set hive.exec.max.dynamic.partitions.pernode=1000;
参考资料:
1.《Hive编程指南》
2. Hive官方wiki: