DWH的保留原始历史数据的一种方法
前幾天有朋友咨詢在數(shù)據(jù)倉庫Stage或ODS層該如何保存歷史數(shù)據(jù), 他的這個問題其實很普遍, 所以寫了點東西放在博客上.
一般數(shù)據(jù)倉庫項目中, Stage或ODS層要保留幾天或幾個月的源表數(shù)據(jù). 保留歷史業(yè)務數(shù)據(jù)是很必要的, 有時候需要DWH重跑某一天的數(shù)據(jù), 這種情況下, 無法從前端OLTP系統(tǒng)取的當時的數(shù)據(jù). 在比如, 需要DWH在一天內(nèi)要回跑多天batch, 這在項目剛上線時經(jīng)常碰到.
至于是在Stage層還是ODS層保留歷史數(shù)據(jù), 我一般推薦是在Stage層保留歷史, 讓ODS只保留當天的快照數(shù)據(jù). 因為Stage保留的是最原始的數(shù)據(jù).
那如何保留一個表(比如TA表)的歷史數(shù)據(jù)呢? 我能想到的做法有:
1. 將多天的數(shù)據(jù)都放在一個表, 加上一個batch_id字段來區(qū)分到底是哪天的數(shù)據(jù).
2. 用不同表名保存, 比如TA_20110509, TA_20110510 等等.
3. 表名相同, 但把表放在不同的schema下, 比如B20110509.TA, B20110510.TA
這3種做法各有優(yōu)缺點:
方法1的優(yōu)點是, 實現(xiàn)起來簡單, 缺點也很明顯, 就是效率會很差, 如果TA是個大表, 更是如此.
方法2的優(yōu)點是, 和方法1比, 查詢和操作數(shù)據(jù)的效率要好, 缺點是, 編程會復雜一些, 尤其是使用ETL工具, 你可能使用變量或者其他手段將表名傳給ETL Job.
方法3的優(yōu)缺點和方法2基本相同, 另外的優(yōu)點是,數(shù)據(jù)庫backup管理的粒度能做的很細. 另外一個缺點是, 需要管理多個schema的權限, 會繁瑣一些.
我推薦采用方法2. 上面講了方法2比方法1會復雜一些, 有沒有相對簡單的實現(xiàn)方式呢? 下面是我給的一個思路和實現(xiàn)方法.
思路, 假設TA表, 需要保存7份, 分別保存在TA_0, TA_1, TA_2, ..., TA_6表中, 第一次保存到TA_0表, 以此類推, 第7次保存到TA_6表, 第8次再重新使用TA_0表. 我們可以動態(tài)生成兩個視圖, V_TA和V_TA_LAST,. V_TA視圖指向當前batch的工作表,V_TA_LAST指向上一個batch的工作表. 另外, V_TA視圖是屬于那種可更新的視圖, 所以可以在ETL Job(或ETL SP)中V_TA, 而不需直接用TA_0或其他表.
實現(xiàn):
實際項目中, 不同表保存的份數(shù)可能不同, 另外需求可能在項目實施過程中, 也有變化, 所以最好是做成可配置模式. 下面給出2個表, Table_Version_Control_Static定義了各個表的版本控制規(guī)則, Table_Version_Control_History記錄各表版本控制歷史.
上面講過, TA表如果需要保存7份, 分別保存在TA_0, TA_1, TA_2, ..., TA_6表中, 第一次保存到TA_0表, 以此類推, 第7次保存到TA_6表, 第8次再重新使用TA_0表, 這個過程有點像時鐘, 周而復始, 如下圖.
可寫成一個存儲過程sp_clock_go_ahead(n)來完成這個時鐘旋轉(zhuǎn)過程. 具體講,該存儲過程依次完成如下工作:
1. 動態(tài)創(chuàng)建TA_n, 如果TA_n不存在的話.
2. 修改V_TA視圖, 讓它指向TA_n.
3. 修改V_TA_LAST視圖, 讓它指向TA_n-1
雖然V_TA視圖是可更新的,但不支持truncate操作, 所以可以寫一個簡單的sp(比如sp_Truncate_Table)來完成truncate操作.
有了上面的2個表和2個存儲過程, 不管是全量刷新表還是增量刷新表, 都很簡單, 步驟見下:
一. 如采用增量刷新(Incremental), 刷新的步驟是:
1. 執(zhí)行sp_Clock_Go_Ahead()
2. 如果Save_Points>1, 原樣復制V_TA_LAST至V_TA, 結(jié)果是V_TA和V_TA_LAST記錄數(shù)一致
3. Delta Load 到 V_TA
二. 如采用全量刷新(Full), 刷新的步驟是:
1. 執(zhí)行sp_Clock_Go_Ahead()
2. 執(zhí)行sp_Truncate_Table() ,來truncate 表TA_n
3. Load data 到 V_TA
總結(jié)
以上是生活随笔為你收集整理的DWH的保留原始历史数据的一种方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 打招呼九句
- 下一篇: 气象数据之数据查看(panoply)