在批量数据同步中,有些表的数据量会随着业务的发展越来越大,如果按周期全量同步的方式会影响处理效率。在这种情况下,可以选择每次只同步新变更的增量数据,然后与上一个同步周期获得的全量数据进行合并,从而获得最新版本的全量数据。
在传统的数据整合方案中,合并技术大多采用 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
;