动态分区功能,可以基于查询参数推断出要创建的分区名称
手动分区灵活性太低,当分区数较多时一个个分区单独去加载数据工作量太大,这时候考虑动态分区。动态分区基于hive的源数据表将数据插入到分区表中,在数据插入的时候会根据分区字段自动将数据归类存入对应的分区路径,不需要手动指定分区
注意:系统默认以最后一个字段为分区名,因为分区表的分区字段默认也是该表中的字段,且依次排在表中字段的最后面。所以分区需要分区的字段只能放在后面,不能把顺序弄错。如果我们查询了四个字段的话,则会报错,因为该表加上分区字段也才三个。要注意系统是根据查询字段的位置推断分区名的,而不是字段名称
在select语句中使用分区值来动态指明分区[单个字段分区]
insert overwrite table stu_part1 partition(sex) select id,name,age,department,sex from student;
不需要指定数据要落到哪个分区 stu_part1以 sex作为分区
注意:使用,insert…select 往表中导入数据时,查询的字段个数必须和目标的字段个数相同,不能多,也不能少,否则会报错。但是如果字段的类型不一致的话,则会使用null值填充,不会报错。而使用load data形式往hive表中装载数据时,则不会检查。如果字段多了则会丢弃,少了则会null值填充。同样如果字段类型不一致,也是使用null值填充
1、混合使用静态分区和动态分区
在动静结合使用时需要注意静态分区值必须在动态分区值的前面。所以建议使用动态分区,且insert进行分区的使用建议使用OVERWRITE,避免数据重复
insert overwrite table stu_part2 partition(sex=‘男’,department)
select id,name,age,department from student;
2、全部实现动态分区插入数据
insert overwrite table stu_part3 partition(sex,department)
select id,name,age,sex,department from student;
字段的个数和顺序不能弄错
动态分区功能默认情况下没有开启,开启后,默认是以"严格"模式执行
3、动态分区属性
1> 开启动态分区
set hive.exec.dynamic.partition=true;
2> 配置文件 hive-site.xml属性 hive.exec.dynamic.partition 默认为 true
3> 动态分区的模式,默认 strict,表示必须指定至少一个分区为静态分区,nonstrict模式表示允许所有的分区字段都可以使用动态分区 set hive.exec.dynamic.partition.mode=nonstrict;
4> 配置文件 hive-site.xml属性hive.exec.dynamic.partition.mode默认为 strict
5> 默认值:1000
被一条带有动态分区的SQL语句所能创建的动态分区总量,如果超出限制会报错在所有执行MR的节点上,最大一共可以创建多少个分区
set hive.exec.max.dynamic.partitions=1000;
6> 默认值:100
能够被每个mapper或者reducer创建的最大动态分区的数目,如果一个mapper或者reducer试图创建多余这个值的动态分区数目,会报错在每个执行MR的节点上,最大可以创建多少个动态分区该参数需要根据实际的数据来设定
set hive.exec.max.dynamic.partitions.pernode=1000;