关系型数据库中,对分区表 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)