在大数据处理,当使用内存级引擎,这时候一般是不推荐直接运行全量的(土豪除外),得采用增量逻辑,正常只有关联的话,我们按照时间月或年或天分区,即可实现增量更新数据,但是当新增数据涉及到历史数据来进行聚合,排序等操作,我们就需要根据主键去历史数据拉取相关的数据到数据出来计算聚合,再将相关分区的数据进行覆盖和剔除才是正确的,下面是一种实现逻辑,sys_loaddate是月份区,k1,k2是联合主键:
with incre_data as (
select * from db.dws_tb
where sys_loaddate >= from_unixtime(unix_timestamp(add_months(current_date(),-5)),'yyyy-MM') --6个月历史数据
)
insert overwrite table db.ads_tb partition(sys_loaddate)
select t1.k1,t1.k2
,t1.sys_loaddate
from (
--获取增量数据
select * from incre_data
union all
--获取增量数据出现在历史中的数据
select *
from db.dws_tb
where
sys_loaddate >= from_unixtime(unix_timestamp(add_months(current_date(),-17)),'yyyy-MM')
and sys_loaddate < from_unixtime(unix_timestamp(add_months(current_date(),-5)),'yyyy-MM') -- 只算过去6个月开始一年范围的历史数据
and concat(nvl(k1,''),nvl(k2,'')) in
(
select
concat(nvl(k1,''),nvl(k2,''))
from incre_data
)
) t2
union all
-- 只获取历史分区受新增数据影响的分区,然后将获得的分区数据,进行剔除新增中有的tuid和sn的数据,减少计算量
select * from db.ads_tb
where sys_loaddate in (
select sys_loaddate from db.ads_tb
where concat(nvl(k1,''),nvl(k2,'')) in (
select concat(nvl(k1,''),nvl(k2,'')) from incre_data
)
)
and concat(nvl(k1,''),nvl(k2,'')) not in (
select concat(nvl(k1,''),nvl(k2,'')) from incre_data
)
;