Hive Dynamic Partition

简介

本文介绍Hive动态分区表的使用

作用

如果我们按天去insert分区数据,那么我们可以去指定静态分区的名称去插入数据.但是当我们不能确定分区名称时,便要使用动态分区去处理分区表.

实例

准备数据如下,为顾客数据.字段分别为id,name,orderdate.

1,jack,2016/11/11
2,michael,2016/11/12
3,summer,2016/11/13
4,spring,2016/11/14
5,nero,2016/11/15
6,book,2016/12/21
7,node,2016/12/22
8,tony,2016/12/23
9,green,2016/12/24
10,andy,2016/12/25
11,kaith,2016/12/26
12,spring,2016/12/27
13,andy,2016/12/28
14,tony,2016/12/29
15,green,2016/12/30
16,andy,2016/12/31
17,kaith,2017/1/1
18,xiaoming,2017/1/2

我们把数据放入一张名为t_temp的表中.

create table t_temp(id int,name string,orderdate string)
row format delimited
fields terminated by ',';

load date local inpath '/home/spark/jar/testdata/Customer.txt' into table t_temp;

然后建立分区表t_part

create table if not exists t_part
(id int ,name string ,orderdate string)
partitioned by (year string,month string)
row format delimited 
fields terminated by ',';

我们使用静态分区可能会执行如下的语句插入数据:

insert into t_part partition(year = '2016',month = '12')
select id,name,orderdate from t_temp
where substring(orderdate,1,7) = '2016/12'

当分区数少的时候,我们可以采用这种方式去insert数据.当分区数过多或者分区名称未知时,我们需要去使用动态分区.

hive参数配置

在使用动态分区之前,我们要进行一些参数的配置.

hive.exec.dynamic.partition

默认值:false

是否开启动态分区功能,默认false关闭。

使用动态分区时候,该参数必须设置成true;

hive.exec.dynamic.partition.mode

默认值:strict

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

一般需要设置为nonstrict

hive.exec.max.dynamic.partitions.pernode

默认值:100

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

该参数需要根据实际的数据来设定。

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

hive.exec.max.dynamic.partitions

默认值:1000

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

同上参数解释。

hive.exec.max.created.files

默认值:100000

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

一般默认值足够了,除非你的数据量非常大,需要创建的文件数大于100000,可根据实际情况加以调整。

hive.error.on.empty.partition
默认值:false

当有空分区生成时,是否抛出异常。

一般不需要设置.

在设置完这些参数之后,我们可以执行如下的insert指令去使用动态分区

set hive.exec.dynamic.partition = true;
set hive.exec.dynamic.partition.mode = nonstrict;
insert overwrite table t_part partition(year,month)
select id,name,orderdate,substring(orderdate,1,4),substring(orderdate,6,2) from t_temp;

执行结果如下:

Loading data to table test_neil.t_part partition (year=null, month=null)
     Time taken for load dynamic partitions : 651
    Loading partition {year=2016, month=12}
    Loading partition {year=2017, month=01}
    Loading partition {year=2016, month=11}
     Time taken for adding to write entity : 1
Partition test_neil.t_part{year=2016, month=11} stats: [numFiles=1, numRows=5, totalSize=97, rawDataSize=92]
Partition test_neil.t_part{year=2016, month=12} stats: [numFiles=1, numRows=11, totalSize=210, rawDataSize=199]
Partition test_neil.t_part{year=2017, month=01} stats: [numFiles=1, numRows=2, totalSize=43, rawDataSize=41]

我们可以去查看这张表的分区情况:

show partitions t_part;

显示分区的情况如下:

partition
year=2016/month=11
year=2016/month=12
year=2017/month=01
year=__HIVE_DEFAULT_PARTITION__/month=__HIVE_DEFAULT_PARTITION__

注意:

  • 动态分区在insert数据的时候,分区字段要放在插入字段的最后面,同时要和指定的分区字段的顺序一致.
  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值