ETL中增量更新是一個(gè)比較依賴(lài)與工具和設計方法的過(guò)程,Kettle中主要提供Insert / Update 步驟,Delete 步驟和Database Lookup 步驟來(lái)支持增量更新,增量更新的設計方法也是根據應用場(chǎng)景來(lái)選取的,雖然本文討論的是Kettle的實(shí)現方式,但也許對其他工具也有一些幫助。本文不可能涵蓋所有的情況,歡迎大家討論。
應用場(chǎng)景
增量更新按照數據種類(lèi)的不同大概可以分成:
1. 只增加,不更新,
2. 只更新,不增加
3. 即增加也更新
4. 有刪除,有增加,有更新
其中1 ,2, 3種大概都是相同的思路,使用的步驟可能略有不同,通用的方法是在原數據庫增加一個(gè)時(shí)間戳,然后在轉換之后的對應表保留這個(gè)時(shí)間戳,然后每次抽取數據的時(shí)候,先讀取這個(gè)目標數據庫表的時(shí)間戳的最大值,把這個(gè)值當作參數傳給原數據庫的相應表,根據這個(gè)時(shí)間戳來(lái)做限定條件來(lái)抽取數據,抽取之后同樣要保留這個(gè)時(shí)間戳,并且原數據庫的時(shí)間戳一定是指定默認值為sysdate當前時(shí)間(以原數據庫的時(shí)間為標準),抽取之后的目標數據庫的時(shí)間戳要保留原來(lái)的時(shí)間戳,而不是抽取時(shí)候的時(shí)間。
對于第一種情況,可以使用Kettle的Insert / Update 步驟,只是可以勾選Don’t perform any update選項,這個(gè)選項可以告訴Kettle你只會(huì )執行Insert 步驟。
對于第二種情況可能比較用在數據出現錯誤然后原數據庫有一些更新,相應的目標數據庫也要更新,這時(shí)可能不是更新所有的數據,而是有一些限定條件的數據,你可以使用Kettle的Update 步驟來(lái)只執行更新。關(guān)于如何動(dòng)態(tài)的執行限定條件,可以參考前一篇文章。
第三種情況是最為常見(jiàn)的一種情況,使用的同樣是 Kettle的Insert / Update 步驟,只是不要勾選Don’t perform any update 選項。
第四種情況有些復雜,后面專(zhuān)門(mén)討論。
對于第1,2,3種情況,可以參考下面的例子。
這個(gè)例子假設原數據庫表為customers , 含有一個(gè)id , firstname , lastname , age 字段,主鍵為id , 然后還加上一個(gè)默認值為sysdate的時(shí)間戳字段。轉換之后的結果類(lèi)似:id , firstname , lastname , age , updatedate . 整個(gè)設計流程大概如下:


關(guān)于第三個(gè)步驟執行insert / update 步驟需要特別解釋一下,

Kettle執行這個(gè)步驟是需要兩個(gè)數據流對比,其中一個(gè)是目標數據庫,你在Target table 里面指定的,它放在The keys to look up the values(s) 左邊的Table field 里面的,另外一個(gè)數據流就是你在前一個(gè)步驟傳進(jìn)來(lái)的,它放在The keys to look up the value(s) 的右邊,Kettle首先用你傳進(jìn)來(lái)的key 在數據庫中查詢(xún)這些記錄,如果沒(méi)有找到,它就插入一條記錄,所有的值都跟你原來(lái)的值相同,如果根據這個(gè)key找到了這條記錄,kettle會(huì )比較這兩條記錄,根據你指定update field 來(lái)比較,如果數據完全一樣,kettle就什么都不做,如果記錄不完全一樣,kettle就執行一個(gè)update 步驟。所以首先你要確保你指定的key字段能夠唯一確定一條記錄,這個(gè)時(shí)候會(huì )有兩種情況:
1.維表
2.事實(shí)表
維表大都是通過(guò)一個(gè)主鍵字段來(lái)判斷兩條記錄是否匹配,可能我們的原數據庫的主鍵記錄不一定對應目標數據庫中相應的表的主鍵,這個(gè)時(shí)候原數據庫的主鍵就變成了業(yè)務(wù)主鍵,你需要根據某種條件判斷這個(gè)業(yè)務(wù)主鍵是否相等,想象一下如果是多個(gè)數據源的話(huà),業(yè)務(wù)主鍵可能會(huì )有重復,這個(gè)時(shí)候你需要比較的是根據你自定義生成的新的實(shí)際的主鍵,這種主鍵可能是根據某種類(lèi)似與sequence 的生成方式生成的,
事實(shí)表在經(jīng)過(guò)轉換之后,進(jìn)目標數據庫之前往往都是通過(guò)多個(gè)外鍵約束來(lái)確定唯一一條記錄的,這個(gè)時(shí)候比較兩條記錄是否相等都是通過(guò)所有的維表的外鍵決定的,你在比較了記錄相等或不等之后,還要自己判斷是否需要添加一個(gè)新的主鍵給這個(gè)新記錄。
上面兩種情況都是針對特定的應用的,如果你的轉換過(guò)程比較簡(jiǎn)單,只是一個(gè)原數據庫對應一個(gè)目標數據庫,業(yè)務(wù)主鍵跟代理主鍵完全相同的時(shí)候完全可以不用考慮這么多。
聯(lián)系客服