一、前段时间因为导表需求(从一张表中查找出数据,按日期分区overwrite 到指定分区表中),在Hive里面研究了一下自动分区。
步骤:
1、建好所需分区表
2、设置分区参数
1
2
3
4
|
set
hive.
exec
.
dynamic
.partition=
true
;(可通过这个语句查看:
set
hive.
exec
.
dynamic
.partition;)
set
hive.
exec
.
dynamic
.partition.mode=nonstrict;
SET
hive.
exec
.
max
.
dynamic
.partitions=100000;(如果自动分区数大于这个参数,将会报错)
SET
hive.
exec
.
max
.
dynamic
.partitions.pernode=100000;
|
3、书写代码(特别注意:日期字段一定要放在末尾),例如:
1
2
3
4
5
6
7
|
INSERT
OVERWRITE
TABLE
dw_stage.ds_info_msg partition(cal_dt)
select
id
,...
,pv
,0 uv
,cal_dt
from
dw_stage.tiny_info_msg
|
二、如果要在partition字段用函数处理也可通过通过这种方式实现;例如:
1
2
3
4
5
6
7
8
|
set
hive.
exec
.
dynamic
.partition=
true
;
set
hive.
exec
.
dynamic
.partition.mode=nostrick;
INSERT
OVERWRITE
TABLE
dw_stage.ds_info_msg partition(cal_dt)
SELECT
id
,...
,pv
,date_sub(
'2014-03-23'
,7) cal_dt
FROM
dw_stage.tiny_info_msg07;
|
注意:
果分区是可以确定的话,千万不要用动态分区,动态分区的值是在reduce运行阶段确定的.也就是会把所有的记录distribute by。 可想而知表记录非常大的话,只有一个reduce 去处理,那简直是疯狂的。如果这个值唯一或者事先已经知道,比如按天分区(i_date=20140819) 那就用静态分区吧。静态分区在编译阶段已经确定,不需要reduce处理。