1、分区数为什么会多?
如果一张表,分区数较多,有几个原因:
1)是这张表的数据量较大,如果不分区就会全表查询,导致运行时间缓慢,所以需要将查询的字段设置为分区关键字,比如天、终端类型、小时等等
2)业务需求,一张表使用场景很多,业务使用会按照不同的场景来限制表的查询使用,所以分区字段需要很多,甚至有三级分区字段。
2、分区数太多会造成什么影响?
如果表的数据量很大,那么分区数多影响范围会小一点,但是如果表的数据量不大,分区数是因为业务需求导致很大,那么就会造成太多的小文件,在数据仓库中小文件太多简直就是灾难,不管在元数据维护方面还是数据处理方面,小文件都会带来资源的耗费和时间的延迟。
3、如何从业务方面解决小文件数?
1)对于数据量大且分区多的表,比如原始日志,那么建议定期将历史数据同步到廉价存储的机器组中,在需要的时候再回流数据到当前数据仓库中。也叫冷热数据分离存储。
2)对于数据量小且分区多的表,如果可以清理历史数据那么直接设置生命周期即可。但是如果历史数据需要保留,那么建议如下操作:将历史当天的全部分区数据都汇总为一个分区写入当前。举例:一张表有小时分区,一天24个。可以将当前的24个分区都写入小时=00的分区,将其他23个分区数据删除掉。这样既保留了数据,又清理了分区。
4、代码实现
--将数据插入到备份表
insert overwrite product_table_bak partition(ds,hh)
select
col1,
col2,
ds,
hh
from
product_table
where ds = '20200101';
--删除当天数据
alter table product_table drop if exists partition (ds='20200101');
--将当天的24个分区都插入到同一个分区中
insert overwrite product_table partition(ds,hh)
select
col1,
col2,
ds,
'00' as hh
from
product_table_bak
where ds = '20200101';