本文主要介绍关系型数据库的三种同步方式,并提供相关代码。这三种方案在我的实际工作中都有用到,欢迎在评论区交流!
增量同步
表设计
表名:ods_{数据源缩写}_{原始表名},以订单为例:ods_ord_order
表性质:每日全量分区表
生命周期:保留近30天的历史数据
抽取增量
常规情况下,我们按照更新时间或者创建时间来抽取增量,如果是第一次初始化抽取,则应该是抽取全量。
日志表和更新表的第一次初始化抽取
select *
, now() etl_time
from t_ord_order -- 原始表
更新表常规抽取
若数据源是更新表,则按照数据的更新时间来抽取。
select *
, now() as etl_time
from t_ord_order -- 原始表
where 更新时间 >= DATE_SUB(curdate(),INTERVAL -1 DAY)
;
日志表常规抽取
若数据源是日志表,则按照数据的创建时间来抽取。
select *
, now() as etl_time
from t_ord_order -- 原始表
where 创建时间 >= DATE_SUB(curdate(),INTERVAL -1 DAY)
;
合并
insert overwrite ods_ord_order partition(ds = replace(days_sub(now(),1),'-',''))
select id
, order_id
...
, elt_time
from (
select *
, row_number() over(partition by id order by 更新时间/创建时间 desc, etl_time desc) as level
from (
select *
from ods_ord_order -- 数据仓库表
where ds = replace(days_sub(now(),1),'-','') -- t-1的增量
union
select *
from ods_ord_order -- 数据仓库表
where ds = replace(days_sub(now(),2),'-','') -- t-2的全量
) tmp
) tmp
where level = 1 -- 取最新的记录
;