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'
以上内容引用自