解决增量新增及更新中的拉链表

拉链表

  • 拉链表的核心思想如下:
1.从ODS层获取增量数据(上一天新增和更新的数据)
2.拿着DWD原始拉链表数据 left join 增量数据 ,目的是修改原始拉链中历史数据的结束时间
3.拿着left join 的结果集 再 union all 增量数据,目的是获取到最新的拉链数据
4.把最新的拉链数据,优先保存到DWD对应的临时表中,目的是保证数据安全,即使中途失败原始拉链数据依然存在
5.使用insert+select 方式把临时表中数据灌入DWD拉链表中

一、dwd层的表结构和表数据如下:

create table dwd.dwd_t1(
    id int,
    name string,
    age int,
    enddate string
)partitioned by (startdate string)
row format delimited
fields terminated by ',';
idnameageenddatestartdate
1张三189999-99-992024-05-10
2李四192024-05-102024-05-02
3王五249999-99-992024-05-10

二、ods层的表结构和表数据如下:

create table ods.ods_t1(
    id int,
    name string,
    age int
)partitioned by (dt string)
row format delimited
fields terminated by ',';
idnameagedt
1张三182024-05-10
2李四192024-05-02
3王五242024-05-10
4赵六222024-05-11
1张三192024-05-11
2李四202024-05-11

三、需求:把ods层数据的2024-05-11以增量新增并更新的同步方式同步到dwd层中

1.先创建一张目标表的临时表, 用于放置计算后的结果

create table dwd.dwd_t1_tem(
    id int,
    name string,
    age int,
    enddate string
)partitioned by (startdate string) --临时表也可以不分区
row format delimited
fields terminated by ',';

2.执行sql修改历史数据的结束时间,并且把新增和更新的数据都导入到最新拉链表中

  • 先创建一张目标表的临时表, 用于放置计算后的结果
create table dwd.dwd_t1_tem(
    id int,
    name string,
    age int,
    enddate string
)partitioned by (startdate string) --临时表也可以不分区
row format delimited
fields terminated by ',';
  • 拉链表完整sql如下
with tbl1 as(
    -- 步骤1: 修改历史数据的结束时间
select
    dwd_t1.id ,
    dwd_t1.name ,
    dwd_t1.age ,
    if(ods_t1.id is null or dwd_t1.enddate != '9999-99-99',
        dwd_t1.enddate,
        ods_t1.dt
        ) as enddate,
    dwd_t1.startdate
from dwd.dwd_t1
    left join (select * from ods.ods_t1 where dt = '2024-05-11') as ods_t1
    on dwd_t1.id = ods_t1.id

    union all

    -- 步骤2: 获取新增和更新的数据
select
    id ,
    name ,
    age ,
    '9999-99-99' as enddate,
    dt as startdate
from ods.ods_t1
where dt = '2024-05-11'
)

-- 注意: 最新的拉链数据建议先保存到临时表中,保证数据安全
insert overwrite table dwd.dwd_t1_tem partition(startdate)
select * from tbl1;

-- 最后将临时表数据覆盖回目标表中
insert overwrite table dwd.dwd_t1 partition(startdate)
select * from dwd.dwd_t1_tem;

-- 将临时表删除或者清空数据
truncate table dwd.dwd_t1_tem;
  • 注意:操作前后记得查询是否导入成功
  • 15
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值