动态分区
Hive中有两种分区模式:
- 静态分区
- 动态分区
Hive默认情况下是必须有一个静态分区,其他分区为动态分区(动态分区的功能默认开启)。
同时也可以调配参数设置全动态分区,而且也可以调配一个job与节点上的动态分区数来加快job执行速度。
-- 开启动态分区功能(默认开启)
set hive.exec.dynamic.partition = true;
-- 启用非严格模式(这样所有的分区都可以是动态分区)
set hive.exec.dynamic.partition.mode = nonstrict;
-- 设置一个job可以有1000个动态分区
set hive.exec.max.dynamic.partitions = 1000;
-- 设置job中一个节点可以有100个动态分区(根据实际情况修改,比如有365个分区的话可以就必须大于等于365)
set hive.exec.max.dynamic.partitions.pernode = 100;
-- 设置job可以创建多少文件
set hive.exec.max.created.files = 100000;
-- 当有空分区时是否抛出异常
set hive.error.on.empty.partition = false;
建表:
create table ori_partitioned(
id bigint,
time bigint,
uid string,
keyword string,
url_rank int,
click_num int,
click_url string
)
partitioned by (
p_time bigint
)
row format delimited fields terminated by '\t';
-- 目标表
create table ori_partitioned_target(
id bigint,
time bigint,
uid string,
keyword string,
url_rank int,
click_num int,
click_url string
)
partitioned by (
p_time string
)
row format delimited fields terminated by '\t';
导入数据:
load data local inpath '/usr/hdk/data/ds1' into table ori_partitioned partition(p_time='20111230000010') ;
load data local inpath '/usr/hdk/data/ds2' into table ori_partitioned partition(p_time='20111230000011') ;
然后将源表的数据查询插入到目标表,查看目标表是否会自己分区。
insert
overwrite
table
ori_partitioned_target
partition (
p_time
)
select
id,
time,
uid,
keyword,
url_rank,
click_num,
click_url,
p_time
from
ori_partitioned
;
查看表的分区情况
show partitions ori_partitioned_target;