hive 分区 动态 hive动态分区表_hive分区

之前说过分区表,分区都是用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:

https://cwiki.apache.org/confluence/display/HIVE