Hive:二级分区、动态分区和混合分区

1

二级分区

所谓二级分区,就是一个表有两个分区,概念很简单。

当然 Hive 支持一个表有多个分区

这里有一份测试数据,是每个月的销量数据

今天的例子以这份数据来演示

下面建一个带两个分区的明细表,并往里面插入数据

create table tempon.t_access_partition(

uname string,

uaccount int

)

partitioned by (uyear string,umonth string);

往表插入明细数据,把 umonth 的年和月解析出来,放到分区里

INSERT OVERWRITE table tempon.t_access_partition

PARTITION (uyear = '2015' ,umonth = '01')

select uname,ucount from tempon.t_access2 where year(umonth) = '2015' and month(umonth) = '01';

INSERT OVERWRITE table tempon.t_access_partition

PARTITION (uyear = '2015' ,umonth = '02')

select uname,ucount from tempon.t_access2 where year(umonth) = '2015' and month(umonth) = '02';

INSERT OVERWRITE table tempon.t_access_partition

PARTITION (uyear = '2015' ,umonth = '03')

select uname,ucount from tempon.t_access2 where year(umonth) = '2015' and month(umonth) = '03';

select * from tempon.t_access_partition;

这里我们使用手工的方式往表的每个分区插入数据

HDFS 上每个分区都是一个目录,插入成功了

2

动态分区

上面的例子是手工写 sql 的方式往里面插入数据的,数据一多的话,就很麻烦了,Hive 当然考虑到这件事了,Hive 支持动态分区

可以根据我们指定的某个字段的值,将数据动态写入对应的分区。

现在需求是,算出每个月的销售额,并写入对应的分区

为此,我们建一张每月的销量统计表

create table tempon.t_access_sum_d (

ucount int)

partitioned by (uyear string,umonth string);

现在统计tempon.t_access2 每个月的销售额,并且插入到结果表中。

使用 Hive 的动态分区功能,需要开启两个参数:

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

set hive.exec.dynamici.partition=true;

insert overwrite table tempon.t_access_sum_d

partition(uyear,umonth)

select sum(ucount),year(umonth),month(umonth) from tempon.t_access2 group by year(umonth),month(umonth)

使用这个sql就能算好销量,自动加入分区了

结果:

3

混合分区

假设这样一种情况,我们使用了动态分区,一张表的某个字段的值,决定了另一张表的分区,

如果由于存在脏数据,或人为指定字段错误,就会在另一张表产生茫茫多的分区。

hive的分区数据也是元数据的一部分,由hdfs的namenode管理,hive启动后,会缓存在内存中。

一级分区过多会影响集群性能。

为了避免这种情况,就该使用混合分区。

混合分区的概念并不复杂,就是混合了动态分区和静态分区。且静态分区应该放到动态分区的前面。

插入数据时,第一级分区写死,第二级分区使用动态分区。这样就有效控制了由于分区过多,导致文件名过多,影响hdfs性能的问题。

建表语句示例和动态分区一样,只是在数据插入时会体现出混合分区。

如下,我们手工限制第一个分区是2015年的数据

insert overwrite table tempon.t_access_sum_d

partition(uyear='2015',umonth)

select sum(ucount),month(umonth) from tempon.t_access2 group by year(umonth),month(umonth)

having year(umonth) = '2015'

 

 

以上内容引用自

Hive系列:二级分区、动态分区和混合分区 - 腾讯云开发者社区-腾讯云 (tencent.com)

posted @   飞舞的小蛇  阅读(1313)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示