使用ETL構建數據倉庫的思考

使用ETL構建數據倉庫的思考前端

背景:公司的數據倉庫建設項目啓動在即,所謂萬事開頭難,如何在咱們數倉建設規劃的前期作好業務數據準備和系統建設規劃是咱們須要思考的問題,這裏根據以前的本身參與過的公司ODS系統運維、數據倉庫項目建設和運維方面參與過的一些實際工做經驗,並結合必定的數倉建設的理論知識,來簡要介紹一下關於數據建設環節中ETL部分的基本知識,並談一些本身的想法和思考,但願能給你們一些啓發和幫助。數據庫

在數據倉庫構建中,ETL貫穿於項目始終,它是整個數據倉庫的生命線,包括了從數據清洗、整合,到轉換,加載等的各個過程,若是說數據倉庫是一座大廈,那麼ETL就是大廈的根基,ETL抽取整合數據的好壞直接影響到最終的結果展示。因此ETL在整個數據倉庫項目中起着十分關鍵的做用,必須擺到十分重要的位置。安全

1、什麼是ETL

ETL是數據抽取(Extract)、轉換(Transform)、加載(Load )的簡寫,它是將OLTP系統中的數據通過抽取,並將不一樣數據源的數據進行轉換、整合,得出一致性的數據,而後加載到數據倉庫中。簡而言之ETL是完成從 OLTP系統到OLAP系統的過程。性能優化

2、數據倉庫的架構

數據倉庫(Data Warehouse \ DW)是基於OLTP系統的數據源,爲了便於多維分析和多角度展示將其數據按特定的模式進行存儲而創建的關係型數據庫,它不一樣於多維數據庫,數據倉庫中的數據是細節的,集成的,數據倉庫是面向主題的,是以 OLAP系統爲分析目的。它包括星型架構與雪花型架構,其中星型架構中間爲事實表,四周爲維度表,相似星星;雪花型架構中間爲事實表,兩邊的維度表能夠再有其關聯子表,而在星型中只容許一張表做爲維度表與事實表關聯,雪花型一維度能夠有多張表,而星型不能夠。考慮到效率時,星型聚合快,效率高,不過雪花型結構明確,便於與OLTP系統交互。在實際項目中,一般根據須要綜合運用星型架構與雪花型架構。服務器

根據個人項目經驗,通常建議使用星型架構。由於咱們在實際項目中,每每最關注的是查詢性能問題,至於磁盤空間通常都不是問題。 固然,在維度表數據量極大,須要節省存儲空間的狀況下,或者是業務邏輯比較複雜、必需要體現清晰的層次概念狀況下,可使用雪花型維度。架構

 

 

3、ETL構建企業級數據倉庫五步法的流程

(一)、肯定主題

    即肯定數據分析或前端展示的某一方面的分析主題,例如咱們分析某年某月某一地區的保單銷售狀況,就是一個主題。主題要體現某一方面的各分析角度(維度)和統計數值型數據(量度),肯定主題時要綜合考慮,一個主題在數據倉庫中即爲一個數據集市,數據集市體現了某一方面的信息,多個數據集市構成了數據倉庫。運維

(二)、肯定量度

在肯定了主題之後,咱們將考慮要分析的技術指標,諸如年銷售額此類,通常爲數值型數據,或者將該數據彙總,或者將該數據取次數,獨立次數或取最大最小值等,這樣的數據稱之爲量度。量度是要統計的指標,必須事先選擇恰當,基於不一樣的量度能夠進行復雜關鍵性能指標(KPI)等的計算。工具

(三)、肯定事實數據粒度

在肯定了量度以後咱們要考慮到該量度的彙總狀況和不一樣維度下量度的聚合狀況,考慮到量度的聚合程度不一樣,咱們將採用「最小粒度原則」,即將量度的粒度設置到最小,例如咱們將按照時間對銷售額進行彙總,目前的數據最小記錄到天,即數據庫中記錄了天天的交易額,那麼咱們不能在ETL時將數據進行按月或年彙總,須要保持到天,以便於後續對天進行分析。並且咱們沒必要擔憂數據量和數據沒有提早彙總帶來的問題,由於在後續的創建CUBE時已經將數據提早彙總了。性能

(四)、肯定維度

維度是要分析的各個角度,例如咱們但願按照時間,或者按照地區,或者按照產品進行分析,那麼這裏的時間、地區、產品就是相應的維度,基於不一樣的維度咱們可 以看到各量度的彙總狀況,咱們能夠基於全部的維度進行交叉分析。這裏咱們首先要肯定維度的層次(Hierarchy)和級別(Level),維度的層次是指該維度的全部級別,包括各級別的屬性;維度的級別是指該維度下的成員,例如當創建地區維度時咱們將地區維度做爲一個級別,層次爲省、市、縣三層,考慮到維度表要包含儘可能多的信息,因此創建維度時要符合「矮胖原則」,即維度表要儘可能寬,儘可能包含全部的描述性信息,而不是統計性的數據信息。優化

還有一種常見的狀況,就是父子型維度,該維度通常用於非葉子節點含有成員等狀況,例如公司員工的維度,在統計員工的工資時,部門主管的工資不能等於下屬成員工資的簡單相加,必須對該主管的工資單獨統計,而後該主管部門的工資等於下屬員工工資加部門主管的工資,那麼在創建員工維度時,咱們須要將員工維度創建成父子型維度,這樣在統計時,主管的工資會自動加上,避免了都是葉子節點纔有數據的狀況。

二者的對比:父子維度即自引用表結構,好處是能夠創建不固定深度的樹形結構,很是的靈活。相似日期維度,固定了各個層級,而後經過「層次結構」來創建各個層級間的關係。對於OLAP系統來講,統一的結構具備更強的可讀性,可分析性,因此在不少時候咱們都會將父子維度轉換成寬表。

另外,在創建維度表時要充分使用代理鍵,代理鍵是數值型的ID號碼,好處是代理鍵惟一標識了每一維度成員信息,便於區分,更重要的是在聚合時因爲數值型匹配,JOIN效率高,便於聚合,並且代理鍵對緩慢變化維度有更重要的意義,它起到了標識歷史數據與新數據的做用,在原數據主鍵相同的狀況下,代理鍵起到了對新數據與歷史數據很是重要的標識做用。

    有時咱們也會遇到維度緩慢變化的狀況,好比增長了新的產品,或者產品的ID號碼修改了,或者產品增長了一個新的屬性,此時某一維度的成員會隨着新的數據的加入而增長新的維度成員,這樣咱們要考慮到緩慢變化維度的處理,對於緩慢變化維度,有三種狀況

一、緩慢變化維度第一種類型:歷史數據須要修改。這樣新來的數據要改寫歷史數據,這時咱們要使用UPDATE,例如產品的ID號碼爲123,後來發現ID 號碼錯誤了,須要改寫成456,那麼在修改好的新數據插入時,維度表中原來的ID號碼會相應改成456,這樣在維度加載時要使用第一種類型,作法是徹底更改。

二、緩慢變化維度第二種類型:歷史數據保留,新增數據也要保留。這時要將原數據更新,將新數據插入,須要使用UPDATE / INSERT,好比某一員工2005年在A部門,2006年時他調到了B部門。那麼在統計2005年的數據時就應該將該員工定位到A部門;而在統計 2006年數據時就應該定位到B部門,而後再有新的數據插入時,將按照新部門(B部門)進行處理,這樣咱們的作法是將該維度成員列表加入標識列,將歷史的 數據標識爲「過時」,將目前的數據標識爲「當前的」。另外一種方法是將該維度打上時間戳,即將歷史數據生效的時間段做爲它的一個屬性,在與原始表匹配生成事 實表時將按照時間段進行關聯,這樣的好處是該維度成員生效時間明確。

三、緩慢變化維度第三種類型:新增數據維度成員改變了屬性。例如某一維度成員新加入了一列,該列在歷史數據中不能基於它瀏覽,而在目前數據和未來數據中能夠按照它瀏覽,那麼此時咱們須要改變維度表屬性,即加入新的列,那麼咱們將使用存儲過程或程序生成新的維度屬性,在後續的數據中將基於新的屬性進行查看。

(五)、建立事實表

在肯定好事實數據和維度後,咱們將考慮加載事實表。在公司的大量數據堆積如山時,咱們想看看裏面到底是什麼,結果發現裏面是一筆筆生產記錄,一筆筆交易記錄… 那麼這些記錄是咱們將要創建的事實表的原始數據,即關於某一主題的事實記錄表。

  咱們的作法是將原始表與維度表進行關聯,生成事實表。注意在關聯時有爲空的數據時(數據源髒),須要使用外鏈接,鏈接後咱們將各維度的代理鍵取出放於事實表中,事實表除了各維度代理鍵外,還有各量度數據,這未來自原始表,事實表中將存在維度代理鍵和各量度,而不該該存在描述性信息,即符合「瘦高原則」,即要求事實表數據條數儘可能多(粒度最小),而描述性信息儘可能少。

若是考慮到擴展,能夠將事實表加一惟一標識列,覺得了之後擴展將該事實做爲雪花型維度,不過不須要時通常建議不用這樣作。

  事實數據表是數據倉庫的核心,須要精心維護,在JOIN後將獲得事實數據表,通常記錄條數都比較大,咱們須要爲其設置複合主鍵和索引,覺得了數據的完整性和基於數據倉庫的查詢性能優化,事實數據表與維度表一塊兒放於數據倉庫中,若是前端須要鏈接數據倉庫進行查詢,咱們還須要創建一些相關的中間彙總表或物化視圖,以方便查詢。

ETL開發中補充注意的問題

(一)、準備區的運用

  在構建數據倉庫時,若是數據源位於一服務器上,數據倉庫在另外一服務器端,考慮到數據源Server端訪問頻繁,而且數據量大,須要不斷更新,因此能夠創建準備區數據庫。先將數據抽取到準備區中,而後基於準備區中的數據進行處理,這樣處理的好處是防止了在原OLTP系統中中頻繁訪問,進行數據運算或排序等操做。例如咱們能夠按照天將數據抽取到準備區中,基於數據準備區,咱們將進行數據的轉換,整合,將不一樣數據源的數據進行一致性處理。數據準備區中將存在原始抽取表,一些轉換中間表和臨時表以及ETL日誌表等。

後期計劃上線的公司數倉的數據來源執行現有的鏡像庫軟件,對沒有鏡像庫數據同步的業務系統暫時仍是採用數據直接抽取到臨時加工庫(準備區)的方式進行數據準備。

(二)、時間戳的運用

  時間維度對於某一事實主題來講十分重要,由於不一樣的時間有不一樣的統計數據信息,那麼按照時間記錄的信息將發揮很重要的做用。在ETL中,時間戳有其特殊的做用,在上面提到的緩慢變化維度中,咱們可使用時間戳標識維度成員;在記錄數據庫和數據倉庫的操做時,咱們也將使用時間戳標識信息,例如在進行數據抽取時,咱們將按照時間戳對OLTP系統中的數據進行抽取,好比在午夜0:00取前一天的數據,咱們將按照OLTP系統中的時間戳取GETDATE到 GETDATE減一天,這樣獲得前一天數據。

目前我公司在現有ODS上採用數據獲取機制是經過第三方軟件方式去讀取數據的變化,來獲取變化數據,未能採用業務時間戳的方式來捕獲增量數據,目前看來採用oracle官方的CDC機制(附加在覈心數據庫中增長覈對庫的運行負擔)仍是咱們採購的DSG軟件同步的方式(軟件黑盒機制,發現的數據獲取問題須要第三方廠商的介入,增長了問題處理時間成本),都存在必定的問題,須要咱們業務系統中增長對業務時間戳的變動一致性要求,能夠初步的替換目前第三方的數據獲取機制,保證數據的完整性。

(三)、日誌表的運用(ETL數據流程的問題狀態記錄)

在對數據進行處理時,不免會發生數據處理錯誤,產生出錯信息,那麼咱們如何得到出錯信息並及時修正呢? 方法是咱們使用一張或多張Log日誌表,將出錯信息記錄下來,在日誌表中咱們將記錄每次抽取的條數,處理成功的條數,處理失敗的條數,處理失敗的數據,處理時間等等,這樣當數據發生錯誤時,咱們很容易發現問題所在,而後對出錯的數據進行修正或從新處理。

(四)、使用調度(ETL調度平臺的建設及產品選型

在對數據倉庫進行增量更新時必須使用調度,即對事實數據表進行增量更新處理,在使用調度前要考慮到事實數據量,須要多長時間更新一次,好比但願按天進行查看,那麼咱們最好按天進行抽取,若是數據量不大,能夠按照月或半年對數據進行更新,若是有緩慢變化維度狀況,調度時須要考慮到維度表更新狀況,在更新事實數據表以前要先更新維度表。
  調度是數據倉庫的關鍵環節,要考慮縝密,在ETL的流程搭建好後,要按期對其運行,因此調度是執行ETL流程的關鍵步驟,每一次調度除了寫入Log日誌表的數據處理信息外,還要使用發送Email或報警信息等,這樣也方便的技術人員對ETL流程的把握,加強了安全性和數據處理的準確性。

除了本身建設調度平臺這個手段以外,固然也能夠結合採用一些成熟的商用的ETL調度平臺工具,實現咱們的目標,例如採用一些商用的調度平臺工具軟件Control-M(國外)、TASKCTL(國內)等。

5、總結

  ETL構建數據倉庫須要簡單的五步,掌握了這五步的方法咱們將構建一個強大的數據倉庫,不過每一步都有很深的須要研究與挖掘,尤爲在實際項目中,咱們要綜合考慮,例如若是數據源的髒數據不少,在搭建數據倉庫以前咱們首先要進行數據清洗,以剔除掉不須要的信息和髒數據。
    總之,ETL是數據倉庫的核心,掌握了ETL構建數據倉庫的五步法,就掌握了搭建數據倉庫的根本方法。不過,咱們不能教條,基於不一樣的項目,咱們還將要進行具體分析,如父子型維度和緩慢變化維度的運用等。在數據倉庫構建中,ETL關係到整個項目的數據質量,因此馬虎不得,必須將其擺到重要位置,將ETL這一大廈根基築牢!

 

附:BI工具(ETL部分)

 

相關文章
相關標籤/搜索