?在數(shù)據(jù)倉庫構(gòu)建中,ETL貫穿于項目始終,它是整個數(shù)據(jù)倉庫的生命線,包括了從數(shù)據(jù)清洗,整合,到轉(zhuǎn)換,加載等的各個過程,如果說數(shù)據(jù)倉庫是一座大廈,那么ETL就是大廈的根基,ETL抽取整合數(shù)據(jù)的好壞直接影響到最終的結(jié)果展現(xiàn)。所以ETL在整個數(shù)據(jù)倉庫項目中起著十分關(guān)鍵的作用,必須擺到十分重要的位置。
一、什么是ETL
ETL是數(shù)據(jù)抽?。‥xtract)、轉(zhuǎn)換(Transform)、加載(Load )的簡寫,它是將OLTP系統(tǒng)中的數(shù)據(jù)經(jīng)過抽取,并將不同數(shù)據(jù)源的數(shù)據(jù)進行轉(zhuǎn)換、整合,得出一致性的數(shù)據(jù),然后加載到數(shù)據(jù)倉庫中。簡而言之ETL是完成從OLTP系統(tǒng)到OLAP系統(tǒng)的過程(圖一:pic1.jpg)。
二、數(shù)據(jù)倉庫的架構(gòu)
數(shù)據(jù)倉庫(Data Warehouse \ DW)是基于OLTP系統(tǒng)的數(shù)據(jù)源,為了便于多維分析和多角度展現(xiàn)將其數(shù)據(jù)按特定的模式進行存儲而建立的關(guān)系型數(shù)據(jù)庫,它不同于多維數(shù)據(jù)庫,數(shù)據(jù)倉庫中的數(shù)據(jù)是細節(jié)的,集成的,數(shù)據(jù)倉庫是面向主題的,是以O(shè)LAP系統(tǒng)為分析目的。它包括星型架構(gòu)與雪花型架構(gòu),其中星型架構(gòu)中間為事實表,四周為維度表,類似星星;雪花型架構(gòu)中間為事實表,兩邊的維度表可以再有其關(guān)聯(lián)子表,而在星型中只允許一張表作為維度表與事實表關(guān)聯(lián),雪花型一維度可以有多張表,而星型不可以??紤]到效率時,星型聚合快,效率高,不過雪花型結(jié)構(gòu)明確,便于與OLTP系統(tǒng)交互。在實際項目中,我們將綜合運用星型架構(gòu)與雪花型架構(gòu)。
三、ETL構(gòu)建企業(yè)級數(shù)據(jù)倉庫五步法的流程
(一)、確定主題 即 確定數(shù)據(jù)分析或前端展現(xiàn)的某一方面的分析主題,例如我們分析某年某月某一地區(qū)的啤酒銷售情況,就是一個主題。主題要體現(xiàn)某一方面的各分析角度(維度)和統(tǒng) 計數(shù)值型數(shù)據(jù)(量度),確定主題時要綜合考慮,一個主題在數(shù)據(jù)倉庫中即為一個數(shù)據(jù)集市,數(shù)據(jù)集市體現(xiàn)了某一方面的信息,多個數(shù)據(jù)集市構(gòu)成了數(shù)據(jù)倉庫。
(二)、確定量度在確定了主題以后,我們將考慮要分析的技術(shù)指標,諸如年銷售額此類,一般為數(shù)值型數(shù)據(jù),或者將該數(shù)據(jù)匯總,或者將該數(shù)據(jù)取次數(shù),獨立次數(shù)或取最大最小值等,這樣的數(shù)據(jù)稱之為量度。量度是要統(tǒng)計的指標,必須事先選擇恰當,基于不同的量度可以進行復(fù)雜關(guān)鍵性能指標(KPI)等的計算。
(三)、確定事實數(shù)據(jù)粒度在確定了量度之后我們要考慮到該量度的匯總情況和不同維度下量度的聚合情況,考慮到量度的聚合程度不同,我們將采用“最小粒度原則”,即將量度的粒度設(shè)置到最小,例如我們將按照時間對銷售額進行匯總,目前的數(shù)據(jù)最小記錄到天,即數(shù)據(jù)庫中記錄了每天的交易額,那么我們不能在ETL時將數(shù)據(jù)進行按月或年匯總,需要保持到天,以便于后續(xù)對天進行分析。而且我們不必擔心數(shù)據(jù)量和數(shù)據(jù)沒有提前匯總帶來的問題,因為在后續(xù)的建立CUBE時已經(jīng)將數(shù)據(jù)提前匯總了。
(四)、確定維度 維度是要分析的各個角度,例如我們希望按照時間,或者按照地區(qū),或者按照產(chǎn)品進行分析,那么這里的時間、地區(qū)、產(chǎn)品就是相應(yīng)的維度,基于不同的維度我們可以看到各量度的匯總情況,我們可以基于所有的維度進行交叉分析。這里我們首先要確定維度的層次(Hierarchy)和級別(Level), 維度的層次是指該維度的所有級別,包括各級別的屬性;維度的級別是指該維度下的成員,例如當建立地區(qū)維度時我們將地區(qū)維度作為一個級別,層次為省、市、縣 三層,考慮到維度表要包含盡量多的信息,所以建立維度時要符合“矮胖原則”,即維度表要盡量寬,盡量包含所有的描述性信息,而不是統(tǒng)計性的數(shù)據(jù)信息。 還有一種常見的情況,就是父子型維度 該維度一般用于非葉子節(jié)點含有成員等情況,例如公司員工的維度,在統(tǒng)計員工的工資時,部門主管的工資不能等于下屬成員工資的簡單相加,必須對該主管的工資 單獨統(tǒng)計,然后該主管部門的工資等于下屬員工工資加部門主管的工資,那么在建立員工維度時,我們需要將員工維度建立成父子型維度,這樣在統(tǒng)計時,主管的工 資會自動加上,避免了都是葉子節(jié)點才有數(shù)據(jù)的情況。 另外,在建立維度表時要充分使用代理鍵,代理鍵是數(shù)值型的ID號碼,好處是代理鍵唯一標識了每一維度成員信息,便于區(qū)分,更重要的是在聚合時由于數(shù)值型匹配,JOIN效率高,便于聚合,而且代理鍵對緩慢變化維度有更重要的意義,它起到了標識歷史數(shù)據(jù)與新數(shù)據(jù)的作用,在原數(shù)據(jù)主鍵相同的情況下,代理鍵起到了對新數(shù)據(jù)與歷史數(shù)據(jù)非常重要的標識作用。 有時我們也會遇到維度緩慢變化的情況,比如增加了新的產(chǎn)品,或者產(chǎn)品的ID號碼修改了,或者產(chǎn)品增加了一個新的屬性,此時某一維度的成員會隨著新的數(shù)據(jù)的加入而增加新的維度成員,這樣我們要考慮到緩慢變化維度的處理,對于緩慢變化維度,有三種情況:
1、緩慢變化維度第一種類型:歷史數(shù)據(jù)需要修改。這樣新來的數(shù)據(jù)要改寫歷史數(shù)據(jù),這時我們要使用UPDATE,例如產(chǎn)品的ID號碼為123,后來發(fā)現(xiàn)ID號碼錯誤了,需要改寫成456,那么在修改好的新數(shù)據(jù)插入時,維度表中原來的ID號碼會相應(yīng)改為456,這樣在維度加載時要使用第一種類型,做法是完全更改。
2、緩慢變化維度第二種類型:歷史數(shù)據(jù)保留,新增數(shù)據(jù)也要保留。這時要將原數(shù)據(jù)更新,將新數(shù)據(jù)插入,需要使用UPDATE / INSERT,比如某一員工2005年在A部門,2006年時他調(diào)到了B部門。那么在統(tǒng)計2005年的數(shù)據(jù)時就應(yīng)該將該員工定位到A部門;而在統(tǒng)計2006年數(shù)據(jù)時就應(yīng)該定位到B部門,然后再有新的數(shù)據(jù)插入時,將按照新部門(B部 門)進行處理,這樣我們的做法是將該維度成員列表加入標識列,將歷史的數(shù)據(jù)標識為“過期”,將目前的數(shù)據(jù)標識為“當前的”。另一種方法是將該維度打上時間 戳,即將歷史數(shù)據(jù)生效的時間段作為它的一個屬性,在與原始表匹配生成事實表時將按照時間段進行關(guān)聯(lián),這樣的好處是該維度成員生效時間明確。
3、 緩慢變化維度第三種類型:新增數(shù)據(jù)維度成員改變了屬性。例如某一維度成員新加入了一列,該列在歷史數(shù)據(jù)中不能基于它瀏覽,而在目前數(shù)據(jù)和將來數(shù)據(jù)中可以按 照它瀏覽,那么此時我們需要改變維度表屬性,即加入新的列,那么我們將使用存儲過程或程序生成新的維度屬性,在后續(xù)的數(shù)據(jù)中將基于新的屬性進行查看。
(五)、創(chuàng)建事實表在確定好事實數(shù)據(jù)和維度后,我們將考慮加載事實表。在公司的大量數(shù)據(jù)堆積如山時,我們想看看里面究竟是什么,結(jié)果發(fā)現(xiàn)里面是一筆筆生產(chǎn)記錄,一筆筆交易記錄… 那么這些記錄是我們將要建立的事實表的原始數(shù)據(jù),即關(guān)于某一主題的事實記錄表。我們的做法是將原始表與維度表進行關(guān)聯(lián),生成事實表。 注意在關(guān)聯(lián)時有為空的數(shù)據(jù)時(數(shù)據(jù)源臟),需要使用外連接,連接后我們將各維度的代理鍵取出放于事實表中,事實表除了各維度代理鍵外,還有各量度數(shù)據(jù),這 將來自原始表,事實表中將存在維度代理鍵和各量度,而不應(yīng)該存在描述性信息,即符合“瘦高原則”,即要求事實表數(shù)據(jù)條數(shù)盡量多(粒度最?。?,而描述性信息 盡量少。如果考慮到擴展,可以將事實表加一唯一標識列,以為了以后擴展將該事實作為雪花型維度,不過不需要時一般建議不用這樣做。事實數(shù)據(jù)表是數(shù)據(jù)倉庫的核心,需要精心維護,在JOIN后將得到事實數(shù)據(jù)表,一般記錄條數(shù)都比較大,我們需要為其設(shè)置復(fù)合主鍵和索引,以為了數(shù)據(jù)的完整性和基于數(shù)據(jù)倉庫的查詢性能優(yōu)化,事實數(shù)據(jù)表與維度表一起放于數(shù)據(jù)倉庫中,如果前端需要連接數(shù)據(jù)倉庫進行查詢,我們還需要建立一些相關(guān)的中間匯總表或物化視圖,以方便查詢。
三、ETL中高級技巧的運用
(一)、準備區(qū)的運用在構(gòu)建數(shù)據(jù)倉庫時,如果數(shù)據(jù)源位于一服務(wù)器上,數(shù)據(jù)倉庫在另一服務(wù)器端,考慮到數(shù)據(jù)源Server端訪問頻繁,并且數(shù)據(jù)量大,需要不斷更新,所以可以建立準備區(qū)數(shù)據(jù)庫。先將數(shù)據(jù)抽取到準備區(qū)中,然后基于準備區(qū)中的數(shù)據(jù)進行處理,這樣處理的好處是防止了在原OLTP系統(tǒng)中中頻繁訪問,進行數(shù)據(jù)運算或排序等操作。例如我們可以按照天將數(shù)據(jù)抽取到準備區(qū)中,基于數(shù)據(jù)準備區(qū),我們將進行數(shù)據(jù)的轉(zhuǎn)換,整合,將不同數(shù)據(jù)源的數(shù)據(jù)進行一致性處理。數(shù)據(jù)準備區(qū)中將存在原始抽取表,一些轉(zhuǎn)換中間表和臨時表以及ETL日志表等。
(二)、時間戳的運用時間維度對于某一事實主題來說十分重要,因為不同的時間有不同的統(tǒng)計數(shù)據(jù)信息,那么按照時間記錄的信息將發(fā)揮很重要的作用。在ETL中,時間戳有其特殊的作用,在上面提到的緩慢變化維度中,我們可以使用時間戳標識維度成員;在記錄數(shù)據(jù)庫和數(shù)據(jù)倉庫的操作時,我們也將使用時間戳標識信息,例如在進行數(shù)據(jù)抽取時,我們將按照時間戳對OLTP系統(tǒng)中的數(shù)據(jù)進行抽取,比如在午夜0:00取前一天的數(shù)據(jù),我們將按照OLTP系統(tǒng)中的時間戳取GETDATE到GETDATE減一天,這樣得到前一天數(shù)據(jù)。
(三)、日志表的運用在對數(shù)據(jù)進行處理時,難免會發(fā)生數(shù)據(jù)處理錯誤,產(chǎn)生出錯信息,那么我們?nèi)绾潍@得出錯信息并及時修正呢? 方法是我們使用一張或多張Log日志表,將出錯信息記錄下來,在日志表中我們將記錄每次抽取的條數(shù),處理成功的條數(shù),處理失敗的條數(shù),處理失敗的數(shù)據(jù),處理時間等等,這樣當數(shù)據(jù)發(fā)生錯誤時,我們很容易發(fā)現(xiàn)問題所在,然后對出錯的數(shù)據(jù)進行修正或重新處理。
(四)、使用調(diào)度在對數(shù)據(jù)倉庫進行增量更新時必須使用調(diào)度, 即對事實數(shù)據(jù)表進行增量更新處理,在使用調(diào)度前要考慮到事實數(shù)據(jù)量,需要多長時間更新一次,比如希望按天進行查看,那么我們最好按天進行抽取,如果數(shù)據(jù)量 不大,可以按照月或半年對數(shù)據(jù)進行更新,如果有緩慢變化維度情況,調(diào)度時需要考慮到維度表更新情況,在更新事實數(shù)據(jù)表之前要先更新維度表。調(diào)度是數(shù)據(jù)倉庫的關(guān)鍵環(huán)節(jié),要考慮縝密,在ETL的流程搭建好后,要定期對其運行,所以調(diào)度是執(zhí)行ETL流程的關(guān)鍵步驟,每一次調(diào)度除了寫入Log日志表的數(shù)據(jù)處理信息外,還要使用發(fā)送Email或報警信息等,這樣也方便的技術(shù)人員對ETL流程的把握,增強了安全性和數(shù)據(jù)處理的準確性。
這里對大數(shù)據(jù)技術(shù)感興趣或者想學習大數(shù)據(jù)的朋友,我整理了一套大數(shù)據(jù)的學習視頻免費分享給大家,從入門到實戰(zhàn)都有,大家可以加我的微信:Lxiao_28獲取,還可以入微信群交流!(備注領(lǐng)取資料,真實有效)。
四、總結(jié)
ETL構(gòu)建數(shù)據(jù)倉庫需要簡單的五步,掌握了這五步的方法我們將構(gòu)建一個強大的數(shù)據(jù)倉庫,不過每一步都有很深的需要研究與挖掘,尤其在實際項目中,我們要綜合考慮,例如如果數(shù)據(jù)源的臟數(shù)據(jù)很多,在搭建數(shù)據(jù)倉庫之前我們首先要進行數(shù)據(jù)清洗,以剔除掉不需要的信息和臟數(shù)據(jù)??傊珽TL是數(shù)據(jù)倉庫的核心,掌握了ETL構(gòu)建數(shù)據(jù)倉庫的五步法,就掌握了搭建數(shù)據(jù)倉庫的根本方法。不過,我們不能教條,基于不同的項目,我們還將要進行具體分析,如父子型維度和緩慢變化維度的運用等。在數(shù)據(jù)倉庫構(gòu)建中,ETL關(guān)系到整個項目的數(shù)據(jù)質(zhì)量,所以馬虎不得,必須將其擺到重要位置,將ETL這一大廈根基筑牢!