关系型数据库中,对分区表 Insert 数据时候,数据库自动会根据分区字段的值,将数据插入到相应的分区中,Hive 中也提供了类似的机制,即动态分区(Dynamic Partition),只不过,使用 Hive 的动态分区,需要进行相应的配置。 

1、开启动态分区参数设置 

(1)开启动态分区功能(默认 true,开启) 

hive.exec.dynamic.partition=true 

(2)设置为非严格模式

动态分区的模式,默认 strict,表示必须指定至少一个分区为 静态分区,nonstrict 模式表示允许所有的分区字段都可以使用动态分区。

hive.exec.dynamic.partition.mode=nonstrict 

(3)在所有执行 MR 的节点上,最大一共可以创建多少个动态分区。 

hive.exec.max.dynamic.partitions=1000 

(4)在每个执行 MR 的节点上,最大可以创建多少个动态分区

该参数需要根据实际 的数据来设定。比如:源数据中包含了一年的数据,即 day 字段有 365 个值,那么该参数就 需要设置成大于 365,如果使用默认值 100,则会报错。

hive.exec.max.dynamic.partitions.pernode=100 

(5)整个 MR Job 中,最大可以创建多少个 HDFS 文件。 

hive.exec.max.created.files=100000 

(6)当有空分区生成时,是否抛出异常。一般不需要设置。 

hive.error.on.empty.partition=false 

2、案例

(1)创建分区表 

create table ori_partitioned(
 id bigint,
 time bigint,
 uid string,
 keyword string,
 url_rank int,
 click_num int,
 click_url string
 )
 partitioned by (pkeyword string)
 row format delimited fields terminated by '\t';

(2)设置动态分区 

set hive.exec.dynamic.partition = true;
set hive.exec.dynamic.partition.mode = nonstrict;
set hive.exec.max.dynamic.partitions = 1000;
set hive.exec.max.dynamic.partitions.pernode = 100;
set hive.exec.max.created.files = 100000;
set hive.error.on.empty.partition = false;

导入数据:

insert overwrite table ori_partitioned partition (pkeyword) 
select id, time, uid, keyword, url_rank, click_num, click_url,
keyword as pkeyword
from ori;

注意:insert overwrite table ori_partitioned partition (pkeyword)  中的pkeyword必须叫pkeyword,否则报错。

(3)查看目标分区表的分区情况 

hive (test)>  show partitions ori_partitioned;
 OK
 partition
 pkeyword=1
 pkeyword=10
 pkeyword=11
 pkeyword=12
 pkeyword=13
 pkeyword=14
 pkeyword=15
 pkeyword=16
 pkeyword=17
 pkeyword=18
 pkeyword=19
 pkeyword=2
 pkeyword=20
 pkeyword=24
 pkeyword=25
 pkeyword=27
 pkeyword=28
 pkeyword=3
 pkeyword=30
 pkeyword=31
 pkeyword=36
 pkeyword=39
 pkeyword=4
 pkeyword=439889f58b9ef0a0a70eef792a87572e
 pkeyword=5
 pkeyword=50
 pkeyword=6
 pkeyword=7
 pkeyword=8
 pkeyword=9
 pkeyword=__HIVE_DEFAULT_PARTITION__
 pkeyword=http%3A78dsafwww.131du8.com%2Ftushu%2Fzws00n5yz.shtml
 Time taken: 0.064 seconds, Fetched: 32 row(s)