使用Kettle同步數據


同步數據常見的應用場景包括以下4個種類型:

Ø  只增加、無更新、無刪除

Ø  只更新、無增加、無刪除

Ø  增加+更新、無刪除

Ø  增加+更新+刪除


只增加、無更新、無刪除

對於這種只增加數據的情況,可細分爲以下2種類型:

1)        基表存在更新字段。

通過獲取目標表上最大的更新時間或最大ID,在“表輸入”步驟中加入條件限制只讀取新增的數據。

1.jpg

這裏要注意的是,獲取最大更新時間或最大ID時,如果目標表還沒有數據,最大值會獲取不了。其中的一個解決方法是在“獲取最大ID”步驟的SQL中,加入最小日期或ID的聯合查詢即可,如:

SELECT MAX(ID) FROM

(SELECT MAX(ID) AS ID FROM T1 UNION ALL SELECT 0 AS ID FROM DUAL)

2)        基表不存在更新字段。

通過“插入/更新”步驟進行插入。

2.jpg

插入/更新步驟選項:

3.jpg


只更新、無增加、無刪除

通過“更新”步驟進行更新。

4.jpg

更新選項:

5.jpg



只更新、無增加、無刪除

通過“更新”步驟進行更新。

4.jpg

更新選項:

5.jpg



增加+更新+刪除

這種數據同步情況,可細分爲以下2種情況:

1)        源庫有表保存刪除、更新和新增的信息。

通過條件判斷,分別進行“插入/更新”和“刪除”即可,如下圖所示。

8.jpg

2)        源庫沒有保存增刪改信息

Kettle提供了一種對比增量更新的機制處理這種情況,可通過“合併記錄”步驟實現,該步驟的輸入是新舊兩個數據源,通過關鍵字進行數據值比對,對比結果分爲以下4種類型:

“Identical” : 關鍵字在新舊數據源中都存在,域值相同

“changed” : 關鍵字在新舊數據源中都存在,但域值不同

“new” :  舊數據源中沒有找到關鍵字

“deleted”:  新數據源中沒有找到關鍵字

兩個數據源的數據都進入下一步驟,上述4種結果類型作爲輸出表的標誌字段進行保存。

以下爲示例:

Ø  源數據庫測試腳本

create table k1 (f1 varchar2(200),f2varchar2(200))

truncate table k1;

insert into k1(f1,f2) values('1','11');

insert into k1(f1,f2) values('2','22');

insert into k1(f1,f2) values('5','5');

commit;

Ø  目標數據庫測試腳本

create table k1 (f1 varchar2(200),f2varchar2(200))

truncate table k1;

insert into k1(f1,f2) values('1','1');

insert into k1(f1,f2) values('2','2');

insert into k1(f1,f2) values('3','3');

insert into k1(f1,f2) values('4','4');

commit;

         

合併過程如下:

9.jpg

其中“合併記錄”步驟的選項:

10.jpg

執行後,查詢K1_TEST結果如下:

11.jpg

可以看到,該結果表的BZ字段保存了更新、刪除、新增的記錄信息,通過條件分支即可分別對這些記錄進行相應的處理。

“條件”選項:

12.jpg



Kettle提供了可視化的設計工具,基本上可通過拖拉配置的方式實現以上4種類型的數據同步,操作上相對較爲簡單。

數據同步的性能與源數據庫、目標數據庫以及執行Kettle轉換操作的主機相關,在筆者的測試環境上(源數據庫和目標數據庫部署在雙核CPU/4G內存的PC機上、執行Kettle轉換操作的主機配置爲雙核CPUx2/4G內存,JVM內存堆棧爲256M)、最後一種類型的數據同步,15w的數據,在3分鐘內可以完成。

13.jpg


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章