大数据:如何应对一天抽多批次数据,且批次间包含重复数据的情况

场景:

公司datalake重构项目,由于特殊原因,这边从原数据库拉取数据到大数据平台的最小时间单位为天,也就是说,如果当天11点抽了数据,但是原数据库在下午2点又补数据了,那么再次抽数据的话,第二批次的数据会包含一批次的数据(那么数据就重复了)。
但是可能在大数据平台dws层已经对上一批次的数据进行过计算了,如果删除并重跑一整天的数据,会影响业务(可能领导已经看过展示了),而且有些表是以月份作为分区,一次数据错误,可能得重跑一整个月的数据。

解决思路:


1.在抽数时,添加一个字段load_ts,字段的值为抽数时间(由azkaban调度脚本时传入),也就是说,同一批次抽的数据,load_ts都是相同的。可以以此区分数据批次。
2.datalake分为tmp、src、dwd、dws、ads层,在阿里建议的四层基础上加一个tmp层,用于存放抽取的数据,每次抽取都会先清空该层,也就是说:tmp层始终只保存一批次的数据。
3.在从tmp层到src层时,使用rank对load_ts进行倒叙排序,使用所有字段(除load_ts外)进行分区,取rank为1的。也就是说,相同的数据,保留旧的,舍弃新的。这样的话,src层中第二批次的数据(load_ts为第二次抽的时间)不包含第一批次抽的数据。
4.在从src到dwd层时,使用rank取load_ts最大的所有数据,也就是说,每次只取最新一批次的数据


代码实现:


tmp-src

insert overwrite table tableName partition(xxx)
select * 
from
  (
  select 
    *,rank(partiton by xxx,xxx,xxx order by load_ts desc) as rk
  from
    (
    select * from src.tableName
    union all
    select * from tmp.tableName
    )--tmp_union_src
  )--tmp_union_src_with_rk
where rk = 1;

src-dwd

insert into table tableName partition(xxx)
select * 
from
  (
  select 
    *,rank(order by load_ts desc) as rk
  from tmp.tableName
  )
where rk = 1;

猜你喜欢

转载自blog.csdn.net/x950913/article/details/106949280