大数据增量逻辑--当增量数据涉及历史数据该如何处理

在大数据处理,当使用内存级引擎,这时候一般是不推荐直接运行全量的(土豪除外),得采用增量逻辑,正常只有关联的话,我们按照时间月或年或天分区,即可实现增量更新数据,但是当新增数据涉及到历史数据来进行聚合,排序等操作,我们就需要根据主键去历史数据拉取相关的数据到数据出来计算聚合,再将相关分区的数据进行覆盖和剔除才是正确的,下面是一种实现逻辑,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
)
;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值