Kettle 增量更新設計技巧

2021-06-27 04:31:26 字數 2622 閱讀 3303

有刪除,有增加,有更新

首先你需要判斷你是否在處理乙個維表,如果是乙個維表的話,那麼這可能是乙個scd情況,可以使用kettle的dimension lookup 步驟來解決這個問題,如果你要處理的是事實表,方法就可能有所不同,它們之間的主要區別是主鍵的判斷方式不一樣。

事實表一般都資料量很大,需要先確定是否有變動的資料處在某乙個明確的限定條件之下,比如時間上處在某個特定區間,或者某些欄位有某種限定條件,盡量最大程度的先限定要處理的結果集,然後需要注意的是要先根據id 來判斷記錄的狀態,是不存在要插入新紀錄,還是已存在要更新,還是記錄不存在要刪除,分別對於id 的狀態來進行不同的操作。

處理刪除的情況使用delete步驟,它的原理跟insert / update 步驟一樣,只不過在找到了匹配的id之後執行的是刪除操作而不是更新操作,然後處理insert / update 操作,你可能需要重新建立乙個轉換過程,然後在乙個job 裡面定義這兩個轉換之間的執行順序。

如果你的資料變動量比較大的話,比如超過了一定的百分比,如果執行效率比較低下,可以適當考慮重新建表。

另外需要考慮的是維表的資料刪除了,對應的事實表或其他依賴於此維表的表的資料如何處理,外來鍵約束可能不太容易去掉,或者說一旦去掉了就可能再加上去了,這可能需要先處理好事實表的依賴資料,主要是看你如何應用,如果只是簡單的刪除事實表資料的話還比較簡單,但是如果需要保留事實表相應記錄,可以在維表中增加一條記錄,這條記錄只有乙個主鍵,其他欄位為空,當我們刪除了維表資料後,事實表的資料就更新指向這條空的維表記錄。

定時執行增量更新

可能有時候我們就是定時執行更新操作,比如每天或者乙個星期一次,這個時候可以不需要在目標表中增加乙個時間戳字段來判斷etl進行的最大時間,直接在取得原資料庫的時間加上限定條件比如:

startdate > ? and enddate < ? 

或者只有乙個startdate

startdate > ?   (昨天的時間或者上個星期的時間)

這個時候需要傳乙個引數,用get system info 步驟來取得,而且你還可以控制時間的精度,比如到天而不是到秒的時間。

當然,你也需要考慮一下如果更新失敗了怎麼處理,比如某一天因為某種原因沒有更新,這樣可能這一天的記錄需要手工處理回來,如果失敗的情況經常可能發生,那還是使用在目標資料庫中增加乙個時間欄位取最大時間戳的方式比較通用,雖然它多了乙個很少用的字段。

執行效率和複雜度

刪除和更新都是一項比較耗費時間的操作,它們都需要不斷的在資料庫中查詢記錄,執行刪除操作或更新操作,而且都是一條一條的執行,執行效率低下也是可以預見的,盡量可能的縮小原資料集大小。減少傳輸的資料集大小,降低etl的複雜程度

時間戳方法的一些優點和缺點

優點:  實現方式簡單,很容易就跨資料庫實現了,執行起來也容易設計

缺點:浪費大量的儲存空間,時間戳字段除etl過程之外都不被使用,如果是定時執行的,某一次執行失敗了,就有可能造成資料有部分丟失.

其他的增量更新辦法:

增量更新的核心問題在與如何找出自上次更新以後的資料,其實大多數資料庫都能夠有辦法捕捉這種資料的變化,比較常見的方式是資料庫的增量備份和資料複製,利用資料庫的管理方式來處理增量更新就是需要有比較好的資料庫管理能力,大多數成熟的資料庫都提供了增量備份和資料複製的方法,雖然實現上各不一樣,不過由於etl的增量更新對資料庫的要求是只要資料,其他的資料庫物件不關心,也不需要完全的備份和完全的stand by 資料庫,所以實現方式還是比較簡單的.,只要你建立乙個與原表結構類似的表結構,然後建立乙個三種型別的觸發器,分別對應insert , update , delete 操作,然後維護這個新錶,在你進行etl的過程的時候,將增量備份或者資料複製停止,然後開始讀這個新錶,在讀完之後將這個表裡面的資料刪除掉就可以了,不過這種方式不太容易定時執行,需要一定的資料庫特定的知識。如果你對資料的實時性要求比較高可以實現乙個資料庫的資料複製方案,如果對實時性的要求比較低,用增量備份會比較簡單一點。

幾點需要注意的地方: 1.

觸發器

無論是增量備份還是資料複製,如果原表中有觸發器,在備份的資料庫上都不要保留觸發器,因為我們需要的不是乙個備份庫,只是需要裡面的資料,最好所有不需要的資料庫物件和一些比較小的表都不用處理。 2.

邏輯一致和物理一致

資料庫在資料庫備份和同步上有所謂邏輯一致和物理一致的區別,簡單來說就是同乙個查詢在備份資料庫上和主資料庫上得到的總的資料是一樣的,但是裡面每一條的資料排列方式可能不一樣,只要沒有明顯的排序查詢都可能有這種情況(包括group by , distinct , union等),而這可能會影響到生成主鍵的方式,需要注意在設計主鍵生成方式的時候最好考慮這一點,比如顯式的增加order 排序. 避免在資料出錯的時候,如果需要重新讀一遍資料的時候主鍵有問題.

總結

增量更新是etl中乙個常見任務,對於不同的應用環境可能採用不同的策略,本文不可能覆蓋所有的應用場景,像是多個資料來源匯到乙個目標資料庫,id生成策略,業務主鍵和**主鍵不統一等等,只是希望能給出一些思路處理比較常見的情況,希望能對大家有所幫助。

kettle 增量更新

後面的乙個問號就是表示它需要接受乙個引數,你在這個table input 下面需要指定replace variable in script 選項和execute for each row 為選中狀態,這樣,kettle就會迴圈執行這個sql 執行的次數為前面引數步驟傳入的資料集的大小。kettle執...

kettle教程 增量更新

以下操作都在5.0.1版本下進行開發,其餘版本可以進行自動比對 在平時工作當中,會遇到這種情況,而且很常見。比如 增量抽取 每隔2個小時抽取截至到上次抽取時間的記錄 一 操作前提 存在3張表,源表 t student 同步日誌表 t tbrz 插入表 t target student 表結構如下圖所...

關於kettle時間戳增量更新

之前看到的一篇文章kettle實現資料實時增量同步,這位大佬提出了時間戳增量回滾同步的一種方式,我是根據這篇文章之上進行探索的。但是遇到了一些問題,這裡進行一下記錄 只能同步往前 day這段時間內的刪除操作,因為回滾了一段時間 day,作者也宣告了這點 也只能同步往前 day這段時間內的刪除操作,為...