最近數據交換項目上需要用到ETL工具,原來一直不太了解,經同事介紹kettle可以很方便地進行數據同步。於是簡單試用了一下,實現了從源表到目標表的數據同步(包括增刪改)。
我們的需求如下:將業務系統指定表(source表)中的數據,同步到交換平台上相同結構的表(target表)中。不論source表中的數據新增、修改、刪除,都會同步更新到target表中。我們的思路是,每次同步時,將source表的數據與target表的數據進行比較,標記出source表每條記錄的狀態(新增/修改/刪除),如果是新增/修改的,就插入/更新到target表中;如果是刪除的,就從target表中刪除。
測試過程如下:
1、在數據庫中建立測試用表(table_source、table_target),這兩張表結構一摸一樣。
2、在kettle里新建一個轉換,進行配置如下:
2.1、在輸入工具中,選擇新增兩個“表輸入”步驟,雙擊進行配置,分別選擇source表與target表:
因為是測試簡單起見,就是獲取全部數據了(其實實際情況下,不太可能這么干,否則每次同步都是全量數據獲取,會有性能問題。因此在生產庫中操作時,可能還需要考慮根據日期、時間戳等字段進行過濾,控制數據范圍)。
2.2、在連接工具中,選擇新增一個“合並記錄”步驟,雙擊進行配置:
其中舊數據源選擇target表,新數據源選擇source表。不要搞反了。合並記錄的功能,就是對指定的新舊數據源進行逐條對比,並通過flagfield標志字段,給出哪些記錄是新增的(new),哪些是修改的(changed),哪些是刪除的(deleted),哪些沒有變化(identical)
2.3、在“Flow”工具中,選擇新增一個Switch/Case步驟,用來做不同的處理;在“輸出”工具中,選擇新增一個“插入/更新”步驟、一個“刪除”步驟:
2.4.1、測試一下新增的情況。我們在source表里手工添加幾條數據試試,可以看到數據全部到了target表中:
2.4.2、新增、修改、刪除一起來測試一下(新增1條id為10的記錄、刪除1條id為9的記錄、修改id為4的記錄,將c2字段改為“DDDDDDD”),target表也全部同步更新了:
3、如果需要在target表里增加一個日期字段(opr_date),來記錄一下數據同步的時間,要怎么做呢?稍微有點麻煩,不知道同學們們有無更好的方案。我是這么做的:
在“轉換”中增加一個“字段選擇”步驟,在“輸入”中增加一個“獲取系統信息”步驟,分別配置如下:
修改“插入/更新”步驟,更新字段列表里增加要插入值的字段opr_date,對應賦值為前面“獲取系統信息”步驟”中定義的變量oprdate。這樣就行了: