什么是ODS表?
在ETL架構中,源數據很少會直接抽取加載到數據倉庫EDW,二者之間往往會設置一個源數據的臨時存儲區域,存儲數據在清洗轉換前的原始形態,通常被大家稱做操作型數據存儲,簡稱ODS,在Kimball維度建模理論中,將其稱之為Staging Area(意為部隊從一個戰場轉往另一個戰場的集結地),翻譯過來稱之為數據登台區,如圖所示:
上圖摘自Ralph Kimball的《數據倉庫生命周期工具箱》
為什么需要ODS?
ODS在整個數據中心體系架構中的具有非常重要的作用,體現在以下幾點:
- 統一源數據的數據格式,降低數據清洗轉換的復雜性
一般的數據倉庫應用系統都具有非常復雜的數據來源,這些數據存放在不同的地理位置、不同的數據庫、不同的應用之中,從這些業務系統對數據進行抽取並不是一件容易的事,比如有時源和目標不能直接連通,數據可能會用文件方式上傳上來,這就需要將原始數據先落地到ODS中。因此,ODS用於存放從業務系統直接抽取出來的數據,這些數據從數據結構、數據之間的邏輯關系上都與業務系統基本保持一致,因此在抽取過程中極大降低了數據轉化的復雜性,而主要關注數據抽取的接口、數據量大小、抽取方式等方面的問題。各種原始數據以統一的格式存放在一個數據庫中,更加便於后續的數據清洗與轉換。
- 保留原始數據當時時點的快照,便於數據轉換后的校驗排錯和批次重跑
業務系統中的數據是會發生增刪改變化的,尤其是像客戶、產品、機構這樣的維度數據,其狀態和屬性都會隨着時間不斷改變,而數據倉庫是需要記錄並分析其歷史狀態的,如緩慢變化維(拉鏈表)和快照型事實表,在得到最終的統計分析結果之前,數據會經過一層一層的轉換加工,期間會有大量的計算和處理邏輯,在ETL開發和運維過程中,經常會發現某些公式或處理邏輯有誤,修改之后不得不重跑之前一系列的批次數據,如果之前沒有保留這些時點上的原始數據,則很多數據重跑將變得不可能,因為源系統中的部分數據已經發生了變化,另外將數據快照下來也便於和前端統計查詢結果進行校驗核對,以便找出出錯原因。
- 轉移一部分業務系統細節查詢的功能,並可以支持實時數據的查詢統計
在數據倉庫建立之前,大量的報表、分析是由業務系統直接支持的,在一些比較復雜的報表生成過程中,對業務系統的運行產生相當大的壓力。ODS的數據從粒度、 組織方式等各個方面都保持了與業務系統的一致,那么原來由業務系統產生的報表、細節數據的查詢自然能夠從ODS中進行,從而降低業務系統的查詢壓力。另外由於從源數據到最終的分析結果,需要經歷較長時間的ETL轉換,所以一些對實時性要求比較高的查詢分析是可以直接從ODS中取數的,比如風控預警和實時儀表盤。
ODS表長什么樣?
ODS通常采用數據庫進行存儲,只存儲對數據分析有價值的源數據,數據結構通常和源非常相似,在源表結構基礎上會擴充字段以表示數據來源、數據日期、導入時間等審計信息。一個ODS表的例子:
這個表存儲每天按時間戳增量抽取的血糖檢測記錄,名稱用O_前綴進行標識。紅色區域的字段基本上和源表結構保持一致,也可以只存后期數倉中需要的字段,去掉一些沒有必要的字段,另外一些字段類型也可以做簡單的改變,但要確保可以記錄原始數據的原貌。開頭的兩個字段是ODS表新增的審計字段,其中ETLBATCHID表示數據的批次號,用於表示是哪個時期(點)的數據,如果數據每天一個批次的話,這里將會存一個數字型日期如20190301(YYYYMMDD),如果是每小時一個批次的話,這里可能會存一個帶小時的數字型時間如2019030108(YYYYMMDDHH),之所以存成數字型,是因為數字型占的空間更小,檢索更快,另外在書寫SQL是也比較簡便。當然也可根據需要設為字符型或日期型。PROCESSTIME字段用來表示數據被抽取加載到ODS表的系統時間,該字段也可以省略。另外如果ODS表中的數據來自於多個數據源,則可以增加一個審計字段來表示數據的來源。
對於某些沒有時間戳的維度表、代碼表,其對應的ODS表要如何設計呢?其實也和上邊的表一樣,只需要在源表的結構之前增加批次號等審計字段即可,比如用戶信息表:
如果無法通過時間戳或操作日志來判斷哪些用戶信息發生了改變的話,則每次抽取數據時選擇全量抽取,即將源表中的這個時點的數據全部抽到ODS表,由於每次的快照都已存儲下來,雖然有較大的冗余,但卻非常便於在后續的ETL中利用比對的方式來判斷哪些數據發生了變化。如果數據量較大,也可以采用表分區的方式。
如何快速批量的創建ODS表?
源系統的數據庫類型多種多樣,其中的表成百上千,針對這么多需要抽取的源表,有什么簡便的方式能快速生成對應這些源表的ODS表嗎?HaoheDI提供了一個的功能可以快速生成這些表,操作步驟如下:
1、在數據連接中選擇要生成ODS表的目標數據庫(數據中心),點擊創建ODS表按鈕:
2、彈出頁面后,點擊“選擇源表”,選擇對應的源連接和源表。如圖:選擇源數據庫LOCALMYSQL中的這6張源表作為在HYDW目標數據庫中對應的ODS表的模板。
3、刪減部分表中不必要的字段,這樣在ODS表中將不會創建這個字段,默認是創建全部字段。
4、設置ODS表的命名規則,比如在源表名之前增加O_,也可以在表名之后添加后綴。
5、在自定義字段一欄中,選擇要在ODS表中添加的審計字段:
示例:每個表都將創建三個審計字段,設定其名稱、字段類型、字段長度以及創建位置,保存。
6、其它表如果各項設定相同則選擇同上即可,按Ctrl鍵選擇全部或部分表,點擊創建ODS表按鈕
顯示ODS表創建成功或失敗的信息,建表語句在后台hhdilogs\common\日志中查看。
7、在目標數據連接的元數據中將新生成的ODS表結構導入:
查看表結構,檢查表結構是否符合設定的規則。
創建完ODS表后,可以通過導入Excel模板的方式批量創建數據抽取任務。