全量和增量同步合并问题

在批量数据同步中,有些表的数据量会随着业务的发展越来越大,如果按周期全量同步的方式会影响处理效率。在这种情况下,可以选择每次只同步新变更的增量数据,然后与上一个同步周期获得的全量数据进行合并,从而获得最新版本的全量数据。

在传统的数据整合方案中,合并技术大多采用 merge 方式
( update+insert ):当前流行的大数据平台基本都不支持 update 操作 ,现在我们比较推荐的方式是全外连接( full outer join) +数据全量覆盖重新加载( insert overwrite ),即如日调度,则将当天的增量数据和前一天的全量数据做全外连接,重新加载最新的全量数据。在大数据量规模下,全量更新的性能比 update 要高得多。此外,如果担心数据更新错误问题,可以采用分区方式,每天保持 个最新的全量版本,保留较短的时间周期(如天)

另外,当业务系统的表有物理删除数据的操作,而数据仓库需要保留所有历史数据时,也可以选择这种方式,在数据仓库中永久保留最新全量数据快照 下面我们以淘宝订单表的具体实例来说明。

如淘宝交易订单表,每天新增、变更的增量数据多达几亿条,历史累计至今的全量数据则有几百亿条,面对如此庞大的数据量,如果每天从业务系统全量同步显然是不可能的 可行的方式是同步当天的增量数据,并与数据仓库中的前一天全量数据合并,获得截至当天的最新全量数据。

实操案例:Hive实现增量更新:full outer join 合并 + insert overwrite

原有学生表student

create table student (
id string,
age string,
name string,
dt string
);

insert into table student values
("1","11","zhao","20140101")
,("2","22","qian","20140102")
,("3","33","sun","20140103")
,("4","44","li","20140104");

select * from student;

现有学生表student_temp
数据较原有student的表,数据有新增也有修改

create table student_temp(
id string,
age string,
name string,
dt string
);

insert into table student_temp values
("1","11","zhao","20140101")   -- 原本数据
,("2","999","test","20220323") -- 改动
,("3","999","test","20220323") -- 改动
,("4","44","li","20140104")    -- 原本数据
,("5","55","wang","20140105")  -- 新增数据
;

select * from student_temp;


查看full outer join效果

```sql
select * from student_temp a full outer join student b on a.id = b.id;

开始更新
没有则新增,有则覆盖

SELECT  student_temp.id
        ,coalesce(student_temp.age,student.age) as age 
        ,student_temp.name
        ,coalesce(student_temp.dt,student.dt) as dt
FROM    student_temp
FULL OUTER JOIN student
ON      student_temp.id = student.id
;

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值