Hive动态分区和静态分区的用法

在工作有需要对hive表进行分区,对采集的数据按日,周,月分别进行统计计算。

有两个分区字段:第一个是时间event_date,第二个是周期period。

假如现在有两张表,一张ODS层的表source_table,另一张DWD层的表target_table。

建表语句:

create table source_table_01 
( id int,
  name string
) 
partitioned by (event_date string)
row format delimited 
fields terminated by ','
lines terminated by '\n';

加载数据:

load data local inpath '/root/csdn01.txt' 
into table source_table_01 partition (event_date = '2019-02-17');

(注:如果要用load data 的方式加载数据,则在建表的时候需要指定row format 的格式) 

结果如下:

情景一:

target_table只有一个分区字段: event_date

只有一个分区字段: event_date,数据从source_table采集到target_table。这个时候可以采用动态分区来动态的插入数据。

首先要把dynamic.partition.mode 设置为 nonstrict。

set hive.exec.dynamic.partition.mode=nonstrict;

insert overwrite table target_table_01 partition (event_date)
select 
s.id as target_id,
s.name as target_name,
s.event_date as event_date
from source_table_01 s 

结果如下: 

 

情景二:

target_table有两个分区字段: event_date和period

这是一个动态分区和静态分区相结合的案例。如果直接按照下面的SQL语句来执行的话,将会报错

set hive.exec.dynamic.partition.mode=nonstrict;

insert overwrite table target_table_01 partition (event_date,period='day')
select 
s.id as target_id,
s.name as target_name,
s.event_date as event_date
from source_table_01 s 

FAILED: SemanticException [Error 10094]: Line 1:50 Dynamic partition cannot be the parent of a static partition ''day''

报错原因:分区文件夹是分层的。在HDFS中,分区的路径如下:

/user/hive/warehouse/csdn.db/target_table_01/event_date=2019-02-17/period=day

 可以看到event_date分区的层级在period分区的上一级。当动态创建分区时,应首先创建上层文件夹(event_date),然后创建嵌套的period = 'day'文件夹。 不能在event_date已知之前,就提前提供period = 'day' 分区(静态)。静态分区可以存在,但如果它的上一层级不存在,那么它也不能存在。

解决办法

可以把静态分区period也当做动态分区来处理就可以了。

set hive.exec.dynamic.partition.mode=nonstrict;

insert overwrite table target_table_01 partition (event_date,period)
select 
s.id as target_id,
s.name as target_name,
s.event_date as event_date,
'day' as period
from source_table_01 s;

此时可以看到结果如下: 

 

成功得到数据。

 

  • 1
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值