kettle表數據同步

轉載:http://blog.csdn.net/xiaohai798/article/details/45364561

引:
ods有個工程表來自於上游系統,數據量不大 十幾萬,下游系統需要此數據,並且需要每天提供截止當天的增量數據 要求每條數據給出數據變化時間及標示,即數據若是插入 有插入時間和插入標示 若是修改 有修改時間和修改標示 若是刪除需邏輯刪除、有刪除標示且有刪除時間


解決:
kettle的轉換ktr裏有一個圖元叫做合併記錄,可以把兩個表輸入分爲源和目的根據唯一標示 進行全量比對。由此,我們得到增量的數據流,再寫入到RDBMS裏,即可以實現該需求。實現功能的ktr如下圖:

20150429151510781 (795×546)

1 輸入源 合併記錄

上圖,最左側是兩個表輸入,上面一個cpmis 是上游系統 下面一個被 merge rows擋住了,名字是odso


cpmis

SELECT  
ITEMID,
ITEMCODE,
ITEMPLANCODE,
ITEMNAME,
DEMANDID,
ITEMPROPERTY,
COMPANYID,
MANAGELEVELID,
SPECIALSMALLTYPEID,
PLANTYPEID,
CONSTRUCTPROPERTYID,
AREAID,
ASSISTANTTYPEID,
CONSTRUCTTYPEID,
FEEDEPARTMENTID,
..... FROM PROJECT_AH.ITEMINFO order by ITEMID


odso


SELECT  
ITEMID,
ITEMCODE,
ITEMPLANCODE,
ITEMNAME,
DEMANDID,
ITEMPROPERTY,
COMPANYID,
MANAGELEVELID,
SPECIALSMALLTYPEID,
PLANTYPEID,
CONSTRUCTPROPERTYID,
AREAID,
ASSISTANTTYPEID,
CONSTRUCTTYPEID,
FEEDEPARTMENTID,
..... FROM odso.ITEMINFO order by ITEMID


備註:經測試合併記錄之前要對結果集進行排序記錄,如下
 

2 值映射

如下圖, 將輸入源與目的源的每個字段數據根據唯一字段比較後 到值映射圖元,使用字段名 爲起的後面用到的一個變量名(可任意起),源值列爲系統默認
1 代表輸入源與目標源比較後刪除的數據標誌 2 是輸入源新增 3 是輸入源更新 4是不變 目標值 是自己起的名字 可以根據需要不變 或修改


3 第一次過濾無效記錄

如下圖,條件 flagfield is not null (後面沒顯示完),若條件成立發送給下一步zh_check_date,若不成立發送給空操作。


4 新增數據判斷add2

如下圖,zh_check_date 爲獲取當前的系統時間變量。add2 圖元打開爲 畫圈的圖 左側的地方 ,條件 flagfield  = add_rec ,若成立及發送數據到中間畫圈的add圖元,若不成立則 發送數據到mod_del圖元 (矩形紅框) 假設爲true數據到 add圖元,打開 即是下圖右側 部分 填寫需要插入的數據字段 再到insert圖元 ,即可把輸入源比目標源多的新數據更新到目標表來 並且加上時間戳。



5 修改或刪除 mod_rec

如下圖,假設數據從add2發送而來, 打開矩形框 mod_del 條件flagfield = mod_rec 若true 則發送到 update mapping 若flase 則發送到delete mappinig ,假設是更新,則右側 的查詢關鍵字 是 更新的比較字段 即是一開始合併記錄的比較字段 ,更新字段就是 除了比較字段之外的其他字段。這樣數據就可以從 輸入源更新到目標源。



6 刪除數據 delete mapping

如下圖,假設數據流到了 delete mapping ,則 只需要根據比較字段把 目標表的時間戳更新 和 狀態更新爲del_rec即可,下圖zh_check_type 爲flag_field的值


7 數據結果

zh_check_type 和check_date已更新爲

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