綜合前面的幾個(gè)例子双揪,我們這里來(lái)是實(shí)現(xiàn)下增量數(shù)據(jù)的同步。
這里只是分享一種方法运吓,實(shí)際工作中羽德,還會(huì)有其他更好的方案迅办。
增量同步的整體思路一般就是:首先拿到這張表的增量數(shù)據(jù),怎么拿增量呢姨夹,源表需要有一個(gè)時(shí)間字段矾策,代表該條記錄的最新更新時(shí)間(及只要該條記錄變化贾虽,該時(shí)間字段就會(huì)更新),當(dāng)然有時(shí)間字段最好了菇肃,沒(méi)有的話(huà)取募,可能需要做全表對(duì)比之類(lèi)的操作玩敏;正常情況下旺聚,業(yè)務(wù)系統(tǒng)的表中都是有主鍵的,我們拿到增量數(shù)據(jù)之后陈哑,需要判斷該記錄的新插入的惊窖,還是更新的記錄厘贼,如果是更新記錄嘴秸,我們需要先將數(shù)據(jù)加載到中間表,然后凭疮,根據(jù)主鍵將目標(biāo)表中已存在的數(shù)據(jù)刪除执解,最后再將本次的增量數(shù)據(jù)插入到目標(biāo)表纲酗。
1.配置表的設(shè)計(jì)(元數(shù)據(jù)表)
首先我們需要一張配置表觅赊,來(lái)保存我們要增量同步的表的基本信息
--元數(shù)據(jù)表
create table tm_etl_table(
table_name varchar(50), --表名
is_run int , --調(diào)度狀態(tài)
update_time timestamp,--表數(shù)據(jù)更新時(shí)間
etl_insert_time timestamp --記錄更新時(shí)間
);
我們初始化一條記錄吮螺,我們就以這張ods_tm_book表
一些基礎(chǔ)表準(zhǔn)備
-- 源表
create table tm_book(id int,book_name varchar(10),latest_time timestamp);
-- 源表數(shù)據(jù)初始化
insert into tm_book(id,book_name,latest_time)
select x,x||'_name',clock_timestamp() from generate_series(1,10) x;
-- 目標(biāo)表和中間表
create table ods_tm_book(id int,book_name varchar(10),latest_time timestamp,etl_insert_time timestamp);
create table staging_tm_book(id int,book_name varchar(10),latest_time timestamp);
源表中的數(shù)據(jù)
2.同步數(shù)據(jù)的流程開(kāi)發(fā)
整體流程是這樣的坯约,注意下闹丐,這個(gè)只是為了簡(jiǎn)單演示了這個(gè)增量的例子被因,實(shí)際應(yīng)用的話(huà)得修改卿拴,這是有漏洞的堕花。
2.1更新元數(shù)據(jù)表的狀態(tài)并獲取表更新時(shí)間
就是我們第一個(gè)狀態(tài)缘挽,我們更新tm_etl_table表壕曼,更新is_run=0等浊,表示我們開(kāi)始同步數(shù)據(jù)了,update_time轧飞,初始化為 ‘1970-01-01’过咬,表示我們要拉取所有的數(shù)據(jù)
這里,我們將該表的更新時(shí)間作為變量忍捡,我們會(huì)在后面的轉(zhuǎn)換中使用

2.2 加載數(shù)據(jù)到中間表
我們這里具篇,直接表對(duì)表凌埂,將數(shù)據(jù)插入到staging
其中埃疫,表輸入中栓霜,我們需要根據(jù)前面的更新時(shí)間變量,獲取增量數(shù)據(jù)销凑,注意斗幼,需要勾選上“替換SQL語(yǔ)句中的變量”
這里蜕窿,我們直接就表輸出到中間表桐经,每次都需將清空表數(shù)據(jù)
2.3 加載數(shù)據(jù)到目標(biāo)表
這里次询,主要有3段腳本(為了方便屯吊,就這樣吧)盒卸,根據(jù)主鍵ID,清空目標(biāo)表數(shù)據(jù)蔽介,然后虹蓄,將數(shù)據(jù)插入到目標(biāo)表薇组,最后坐儿,更新tm_etl_table表中的記錄狀態(tài)
好了炭菌,用Kettle實(shí)現(xiàn)一個(gè)增量的邏輯大概就是這樣了黑低,
3.小結(jié)
這里整理幾個(gè)問(wèn)題
3.1 中間表
這里的話(huà)投储,使用了中間表,Kettle中是有一個(gè)控件的,應(yīng)該叫那個(gè)“插入/更新”勋眯,可以根據(jù)主鍵將數(shù)據(jù)更新掉客蹋,這個(gè)控件之前使用時(shí)讶坯,發(fā)現(xiàn)很慢辆琅,就一直沒(méi)用,后面的話(huà)这刷,可能會(huì)寫(xiě)個(gè)例子婉烟,簡(jiǎn)單測(cè)試看看。使用中間表暇屋,緩存下數(shù)據(jù)似袁,也是不錯(cuò)的方法。
3.2 增量流程
目前公司中咐刨,增量抽取昙衅,是這樣的,首先各個(gè)業(yè)務(wù)系統(tǒng)的數(shù)據(jù)導(dǎo)出到文本文件定鸟,然后批量將文件加載到數(shù)據(jù)倉(cāng)庫(kù)中(這里使用循環(huán)加載的)而涉。因?yàn)槊刻斓臄?shù)據(jù)量比較大,如果知己到表的話(huà)仔粥,會(huì)很慢婴谱,使用文件华糖,一些數(shù)據(jù)庫(kù)都有批量加載的命令话告,很快很方便佛呻,比如:PostgreSQL中的copy命令绑莺,Greenplum中的外部表,還有Mysql中的load data等等。