1. 程式人生 > >【Kettle】kettle增量同步變動資料

【Kettle】kettle增量同步變動資料

需求

最近在用kettle同步資料的時候,有增量同步的需求。

之前也遇到過這個需求,查閱了很多文章,也試了很多方法,都沒有實現我所需的簡潔的方式。

這回在我一次次嘗試無果的情況下,突然間的靈光一閃,讓我豁然開朗,原來你就在我眼前。

寫下這篇文章,讓更多的人的時間得到節省。

時間是最稀缺的資源,更多的時間應該花在更有意義的事情上。

軟體相關

使用軟體 kettle
軟體版本 7.1
實現功能 使用kettle增量同步資料
修改日期 2018年11月6日

具體過程:

TEST_A (左圖)TEST_B(右圖)兩張資料表,兩張表結構相同(抱歉,圖沒擷取規整,但不影響內容表達)。

   

ID欄位均為唯一主鍵,TEST_A自增NUMBER型別,LASTUPDATEON欄位表示該行資料最近插入或者修改的時間,DATE型別非空。

假設TEST_A為源資料表,TEST_B為目標表。

TEST_A中的歷史資料變更時相應行的LASTUPDATEON欄位值會變為資料更新時的時間。

根據以上資訊,總結出如下增量更新步驟

1)取TEST_BLASTUPDATEON欄位的最大值,這裡為了方便起見,假設這個最大值為max_date_a

2)取TEST_ALASTUPDATEON欄位大於max_date_a的所有資料行 rows

3)以rows 資料的ID

做對比同步到TEST_B表,如果ID值在TEST_B中存在,則更新除ID欄位外的所有欄位;

     如果ID值在TEST_B中不存在,則插入整行資料(類似 Oracle中的 MERGE INTO)。

kettle操作(這裡假設讀者已經會基本的kettle操作)

最終效果圖

1)如上圖所示,需要兩個表輸入和一個插入/更新,並將三個步驟間的線連線好。

2)MAX_DATE步驟中,配置好資料庫連線,連線到TEST_B,SQL如下(注意結尾沒有分號 ';'

SELECT MAX(LASTUPDATEDON) FROM TEST_B

其他配置預設,點選預覽,看到類似下圖資料表示這一步成功。然後點 “確定

”。

3)在select_a步驟中,同樣配置好資料庫連線,連線到TEST_A表,SQL如下(同樣結尾沒有分號 ';',大於號後邊寫問號'?'替換上一步的值

SELECT * FROM TEST_A WHERE LASTUPDATEDON > ?

然後在“從步驟輸入資料”中選擇上一個步驟的名稱,如此可將上一個步驟獲取的最大時間作為問號位置的值,資料型別仍然為時間型別

4)然後勾選“執行每一行”,這是為了select_a步驟在MAX_DATE執行完後才執行,從而獲取最時間大值。點選“確定”,此時前兩 個步驟間的連線上會多出一個感嘆號圖案,正常。

5)在insert_b中,首先配置好“資料庫連線”,連線到“目標表test_b

6)在下圖中的區域,點選“獲取更新欄位”,然後在出現的很多行欄位中,只留下ID欄位行,刪除其餘欄位行(因為根據文章描述該步驟應該比較ID欄位來進行同步資料)。區域作用是配置比較的欄位

7)在區域點選“獲取和更新欄位”,然後找到在區域中被比較的欄位,將其“更新”下的值改為“N”,表示更新時不更新該欄位,但會在滿足插入條件(前文“增量更新步驟”中已描述清楚本文的插入條件)時插入該欄位,其他欄位也會被插入。點選“確定”。

8)一切設定好之後,點選的執行三角形,然後點選的“啟動”,執行增量同步。

9)執行結果,如圖三個步驟都有綠色對號,並且“步驟度量”表格中有相應的數值表示資料變動則說明增量更新成功。

增量同步結果驗證

以下三張表分別為 同步前TEST_A同步前TEST_B同步後TEST_B ,分別對應於圖test_atest_btest_b_res

同步前TEST_A同步前TEST_B資料作比較,

1)ID12的資料是完全相同的;

2)ID3的資料的LASTUPDATEDON欄位,在test_a中秒數為16,在test_b中秒數為06,兩者不同;

3)test_atest_b多出一行ID4的資料。

同步前TEST_A同步後TEST_B比較,

1)ID12的資料是完全相同的;

2)ID3的資料的LASTUPDATEDON欄位,在test_a中秒數為16,在test_b_res中秒數為16,兩者相同;

3)test_atest_b_res都有ID4的資料完全相同的資料行。

結論

增量同步後,TEST_A的資料與TEST_B的資料完全相同,增量同步成功

test_a
test_a​​​​
test​​​_b
test_b_res

The end.