本文主要介紹關系型數據庫的三種同步方式,並提供相關代碼。這三種方案在我的實際工作中都有用到,歡迎在評論區交流!
增量同步
表設計
表名: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 -- 取最新的記錄
;