第一篇:ETL學(xué)習(xí)心得:探求數(shù)據(jù)倉(cāng)庫(kù)關(guān)鍵環(huán)節(jié)ETL的本質(zhì)
做數(shù)據(jù)倉(cāng)庫(kù)系統(tǒng),ETL是關(guān)鍵的一環(huán)。說(shuō)大了,ETL是數(shù)據(jù)整合解決方案,說(shuō)小了,就是倒數(shù)據(jù)的工具。回憶一下工作這么些年來(lái),處理數(shù)據(jù)遷移、轉(zhuǎn)換的工作倒還真的不少。但是那些工作基本上是一次性工作或者很小數(shù)據(jù)量,使用access、DTS或是自己編個(gè)小程序搞定??墒窃跀?shù)據(jù)倉(cāng)庫(kù)系統(tǒng)中,ETL上升到了一定的理論高度,和原來(lái)小打小鬧的工具使用不同了。究竟什么不同,從名字上就可以看到,人家已經(jīng)將倒數(shù)據(jù)的過(guò)程分成3個(gè)步驟,E、T、L分別代表抽取、轉(zhuǎn)換和裝載。
其實(shí)ETL過(guò)程就是數(shù)據(jù)流動(dòng)的過(guò)程,從不同的數(shù)據(jù)源流向不同的目標(biāo)數(shù)據(jù)。但在數(shù)據(jù)倉(cāng)庫(kù)中,ETL有幾個(gè)特點(diǎn),一是數(shù)據(jù)同步,它不是一次性倒完數(shù)據(jù)就拉到,它是經(jīng)常性的活動(dòng),按照固定周期運(yùn)行的,甚至現(xiàn)在還有人提出了實(shí)時(shí)ETL的概念。二是數(shù)據(jù)量,一般都是巨大的,值得你將數(shù)據(jù)流動(dòng)的過(guò)程拆分成E、T和L。
現(xiàn)在有很多成熟的工具提供ETL功能,例如datastage、powermart等,且不說(shuō)他們的好壞。從應(yīng)用角度來(lái)說(shuō),ETL的過(guò)程其實(shí)不是非常復(fù)雜,這些工具給數(shù)據(jù)倉(cāng)庫(kù)工程帶來(lái)和很大的便利性,特別是開(kāi)發(fā)的便利和維護(hù)的便利。但另一方面,開(kāi)發(fā)人員容易迷失在這些工具中。舉個(gè)例子,VB是一種非常簡(jiǎn)單的語(yǔ)言并且也是非常易用的編程工具,上手特別快,但是真正VB的高手有多少?微軟設(shè)計(jì)的產(chǎn)品通常有個(gè)原則是“將使用者當(dāng)作傻瓜”,在這個(gè)原則下,微軟的東西確實(shí)非常好用,但是對(duì)于開(kāi)發(fā)者,如果你自己也將自己當(dāng)作傻瓜,那就真的傻了。ETL工具也是一樣,這些工具為我們提供圖形化界面,讓我們將主要的精力放在規(guī)則上,以期提高開(kāi)發(fā)效率。從使用效果來(lái)說(shuō),確實(shí)使用這些工具能夠非??焖俚貥?gòu)建一個(gè)job來(lái)處理某個(gè)數(shù)據(jù),不過(guò)從整體來(lái)看,并不見(jiàn)得他的整體效率會(huì)高多少。問(wèn)題主要不是出在工具上,而是在設(shè)計(jì)、開(kāi)發(fā)人員上。他們迷失在工具中,沒(méi)有去探求ETL的本質(zhì)。
可以說(shuō)這些工具應(yīng)用了這么長(zhǎng)時(shí)間,在這么多項(xiàng)目、環(huán)境中應(yīng)用,它必然有它成功之處,它必定體現(xiàn)了ETL的本質(zhì)。如果我們不透過(guò)表面這些工具的簡(jiǎn)單使用去看它背后蘊(yùn)涵的思想,最終我們作出來(lái)的東西也就是一個(gè)個(gè)獨(dú)立的job,將他們整合起來(lái)仍然有巨大的工作量。大家都知道“理論與實(shí)踐相結(jié)合”,如果在一個(gè)領(lǐng)域有所超越,必須要在理論水平上達(dá)到一定的高度
探求ETL本質(zhì)之一
ETL的過(guò)程就是數(shù)據(jù)流動(dòng)的過(guò)程,從不同異構(gòu)數(shù)據(jù)源流向統(tǒng)一的目標(biāo)數(shù)據(jù)。其間,數(shù)據(jù)的抽取、清洗、轉(zhuǎn)換和裝載形成串行或并行的過(guò)程。ETL的核心還是在于T這個(gè)過(guò)程,也就是轉(zhuǎn)換,而抽取和裝載一般可以作為轉(zhuǎn)換的輸入和輸出,或者,它們作為一個(gè)單獨(dú)的部件,其復(fù)雜度沒(méi)有轉(zhuǎn)換部件高。和OLTP系統(tǒng)中不同,那里充滿這單條記錄的insert、update和select等操作,ETL過(guò)程一般都是批量操作,例如它的裝載多采用批量裝載工具,一般都是DBMS系統(tǒng)自身附帶的工具,例如Oracle SQLLoader和DB2的autoloader等。
ETL本身有一些特點(diǎn),在一些工具中都有體現(xiàn),下面以datastage和powermart舉例來(lái)說(shuō)。
1、靜態(tài)的ETL單元和動(dòng)態(tài)的ETL單元實(shí)例;一次轉(zhuǎn)換指明了某種格式的數(shù)據(jù)如何格式化成另一種格式的數(shù)據(jù),對(duì)于數(shù)據(jù)源的物理形式在設(shè)計(jì)時(shí)可以不用指定,它可以在運(yùn)行時(shí),當(dāng)這個(gè)ETL單元?jiǎng)?chuàng)建一個(gè)實(shí)例時(shí)才指定。對(duì)于靜態(tài)和動(dòng)態(tài)的ETL單元,Datastage沒(méi)有嚴(yán)格區(qū)分,它的一個(gè)Job就是實(shí)現(xiàn)這個(gè)功能,在早期版本,一個(gè)Job同時(shí)不能運(yùn)行兩次,所以一個(gè)Job相當(dāng)于一個(gè)實(shí)例,在后期版本,它支持multiple instances,而且還不是默認(rèn)選項(xiàng)。Powermart中將這兩個(gè)概念加以區(qū)分,靜態(tài)的叫做Mapping,動(dòng)態(tài)運(yùn)行時(shí)叫做Session。
2、ETL元數(shù)據(jù);元數(shù)據(jù)是描述數(shù)據(jù)的數(shù)據(jù),他的含義非常廣泛,這里僅指ETL的元數(shù)據(jù)。主要包括每次轉(zhuǎn)換前后的數(shù)據(jù)結(jié)構(gòu)和轉(zhuǎn)換的規(guī)則。ETL元數(shù)據(jù)還包括形式參數(shù)的管理,形式參數(shù)的ETL單元定義的參數(shù),相對(duì)還有實(shí)參,它是運(yùn)行時(shí)指定的參數(shù),實(shí)參不在元數(shù)據(jù)管理范圍之內(nèi)。
3、數(shù)據(jù)流程的控制;要有可視化的流程編輯工具,提供流程定義和流程監(jiān)控功能。流程調(diào)度的最小單位是ETL單元實(shí)例,ETL單元是不能在細(xì)分的ETL過(guò)程,當(dāng)然這由開(kāi)發(fā)者來(lái)控制,例如可以將抽取、轉(zhuǎn)換放在一個(gè)ETL單元中,那樣這個(gè)抽取和轉(zhuǎn)換只能同時(shí)運(yùn)行,而如果將他們分作兩個(gè)單元,可以分別運(yùn)行,這有利于錯(cuò)誤恢復(fù)操作。當(dāng)然,ETL單元究竟應(yīng)該細(xì)分到什么程度應(yīng)該依據(jù)具體應(yīng)用來(lái)看,目前還沒(méi)有找到很好的細(xì)分策略。比如,我們可以規(guī)定將裝載一個(gè)表的功能作為一個(gè)ETL單元,但是不可否認(rèn),這樣的ETL單元之間會(huì)有很多共同的操作,例如兩個(gè)單元共用一個(gè)Hash表,要將這個(gè)Hash表裝入內(nèi)存兩次。
4、轉(zhuǎn)換規(guī)則的定義方法;提供函數(shù)集提供常用規(guī)則方法,提供規(guī)則定義語(yǔ)言描述規(guī)則。
5、對(duì)數(shù)據(jù)的快速索引;一般都是利用Hash技術(shù),將參照關(guān)系表提前裝入內(nèi)存,在轉(zhuǎn)換時(shí)查找這個(gè)hash表。Datastage中有Hash文件技術(shù),Powermart也有類似的Lookup功能。
探求ETL本質(zhì)之二(分類)
昨在IT-Director上閱讀一篇報(bào)告,關(guān)于ETL產(chǎn)品分類的。一般來(lái)說(shuō),我們眼中的ETL工具都是價(jià)格昂貴,能夠處理海量數(shù)據(jù)的家伙,但是這是其中的一種。它可以分成4種,針對(duì)不同的需求,主要是從轉(zhuǎn)換規(guī)則的復(fù)雜度和數(shù)據(jù)量大小來(lái)看。它們包括
1、交互式運(yùn)行環(huán)境,你可以指定數(shù)據(jù)源、目標(biāo)數(shù)據(jù),指定規(guī)則,立馬ETL。這種交互式的操作無(wú)疑非常方便,但是只能適合小數(shù)據(jù)量和復(fù)雜度不高的ETL過(guò)程,因?yàn)橐坏┮?guī)則復(fù)雜了,可能需要語(yǔ)言級(jí)的描述,不能簡(jiǎn)簡(jiǎn)單單拖拖拽拽就可以的。還有數(shù)據(jù)量的問(wèn)題,這種交互式必然建立在解釋型語(yǔ)言基礎(chǔ)上,另外他的靈活性必然要犧牲一定的性能為代價(jià)。所以如果要處理海量數(shù)據(jù)的話,每次讀取一條記錄,每次對(duì)規(guī)則進(jìn)行解釋執(zhí)行,每次在寫入一條記錄,這對(duì)性能影響是非常大的。
2、專門編碼型的,它提供了一個(gè)基于某種語(yǔ)言的程序框架,你可以不必將編程精力放在一些周邊的功能上,例如讀文件功能、寫http://rad.17luntan.com/ClickPortal/W...&alliedsiteid=0“);” onmouseout=“isShowAds = false;isShowAds2 = false;”>數(shù)據(jù)庫(kù)的功能,而將精力主要放在規(guī)則的實(shí)現(xiàn)上面。這種近似手工代碼的性能肯定是沒(méi)話說(shuō),除非你的編程技巧不過(guò)關(guān)(這也是不可忽視的因素之一)。對(duì)于處理大數(shù)據(jù)量,處理復(fù)雜轉(zhuǎn)換邏輯,這種方式的ETL實(shí)現(xiàn)是非常直觀的。
3、代碼生成器型的,它就像是一個(gè)ETL代碼生成器,提供簡(jiǎn)單的圖形化界面操作,讓你拖拖拽拽將轉(zhuǎn)換規(guī)則都設(shè)定好,其實(shí)他的后臺(tái)都是生成基于某種語(yǔ)言的程序,要運(yùn)行這個(gè)ETL過(guò)程,必須要編譯才行。Datastage就是類似這樣的產(chǎn)品,設(shè)計(jì)好的job必須要編譯,這避免了每次轉(zhuǎn)換的解釋執(zhí)行,但是不知道它生成的中間語(yǔ)言是什么。以前我設(shè)計(jì)的ETL工具大挪移其實(shí)也是歸屬于這一類,它提供了界面讓用戶編寫規(guī)則,最后生成C++語(yǔ)言,編譯后即可運(yùn)行。這類工具的特點(diǎn)就是要在界面上下狠功夫,必須讓用戶輕松定義一個(gè)ETL過(guò)程,提供豐富的插件來(lái)完成讀、寫和轉(zhuǎn)換函數(shù)。大挪移在這方面就太弱了,規(guī)則必須手寫,而且要寫成標(biāo)準(zhǔn)c++語(yǔ)法,這未免還是有點(diǎn)難為最終用戶了,還不如做成一個(gè)專業(yè)編碼型的產(chǎn)品呢。另外一點(diǎn),這類工具必須提供面向?qū)<覒?yīng)用的功能,因?yàn)樗豢赡芸紤]到所有的轉(zhuǎn)換規(guī)則和所有的讀寫,一方面提供插件接口來(lái)讓第三方編寫特定的插件,另一方面還有提供特定語(yǔ)言來(lái)實(shí)現(xiàn)高級(jí)功能。例如Datastage提供一種類Basic的語(yǔ)言,不過(guò)他的Job的腳本化實(shí)現(xiàn)好像就做的不太好,只能手工繪制job,而不能編程實(shí)現(xiàn)Job。
4、最后還有一種類型叫做數(shù)據(jù)集線器,顧名思義,他就是像Hub一樣地工作。將這種類型分出來(lái)和上面幾種分類在標(biāo)準(zhǔn)上有所差異,上面三種更多指ETL實(shí)現(xiàn)的方法,此類主要從數(shù)據(jù)處理角度。目前有一些產(chǎn)品屬于EAI(Enterprise Application Integration),它的數(shù)據(jù)集成主要是一種準(zhǔn)實(shí)時(shí)性。所以這類產(chǎn)品就像Hub一樣,不斷接收各種異構(gòu)數(shù)據(jù)源來(lái)的數(shù)據(jù),經(jīng)過(guò)處理,在實(shí)施發(fā)送到不同的目標(biāo)數(shù)據(jù)中去。
雖然,這些類看似各又千秋,特別在BI項(xiàng)目中,面對(duì)海量數(shù)據(jù)的ETL時(shí),中間兩種的選擇就開(kāi)始了,在選擇過(guò)程中,必須要考慮到開(kāi)發(fā)效率、維護(hù)方面、性能、學(xué)習(xí)曲線、人員技能等各方面因素,當(dāng)然還有最重要也是最現(xiàn)實(shí)的因素就是客戶的意象。
探求ETL本質(zhì)之三(轉(zhuǎn)換)
ETL探求之一中提到,ETL過(guò)程最復(fù)雜的部分就是T,這個(gè)轉(zhuǎn)換過(guò)程,T過(guò)程究竟有哪些類型呢?
一、宏觀輸入輸出
從對(duì)數(shù)據(jù)源的整個(gè)宏觀處理分,看看一個(gè)ETL過(guò)程的輸入輸出,可以分成下面幾類:
1、大小交,這種處理在數(shù)據(jù)清洗過(guò)程是常見(jiàn)了,例如從數(shù)據(jù)源到ODS階段,如果數(shù)據(jù)倉(cāng)庫(kù)采用維度建模,而且維度基本采用代理鍵的話,必然存在代碼到此鍵值的轉(zhuǎn)換。如果用SQL實(shí)現(xiàn),必然需要將一個(gè)大表和一堆小表都Join起來(lái),當(dāng)然如果使用ETL工具的話,一般都是先將小表讀入內(nèi)存中再處理。這種情況,輸出數(shù)據(jù)的粒度和大表一樣。
2、大大交,大表和大表之間關(guān)聯(lián)也是一個(gè)重要的課題,當(dāng)然其中要有一個(gè)主表,在邏輯上,應(yīng)當(dāng)是主表Left Join輔表。大表之間的關(guān)聯(lián)存在最大的問(wèn)題就是性能和穩(wěn)定性,對(duì)于海量數(shù)據(jù)來(lái)說(shuō),必須有優(yōu)化的方法來(lái)處理他們的關(guān)聯(lián),另外,對(duì)于大數(shù)據(jù)的處理無(wú)疑會(huì)占用太多的系統(tǒng)資源,出錯(cuò)的幾率非常大,如何做到有效錯(cuò)誤恢復(fù)也是個(gè)問(wèn)題。對(duì)于這種情況,我們建議還是盡量將大表拆分成適度的稍小一點(diǎn)的表,形成大小交的類型。這類情況的輸出數(shù)據(jù)粒度和主表一樣。
3、站著進(jìn)來(lái),躺著出去。事務(wù)系統(tǒng)中為了提高系統(tǒng)靈活性和擴(kuò)展性,很多信息放在代碼表中維護(hù),所以它的“事實(shí)表”就是一種窄表,而在數(shù)據(jù)倉(cāng)庫(kù)中,通常要進(jìn)行寬化,從行變成列,所以稱這種處理情況叫做“站著進(jìn)來(lái),躺著出去”。大家對(duì)Decode肯定不陌生,這是進(jìn)行寬表化常見(jiàn)的手段之一。窄表變寬表的過(guò)程主要體現(xiàn)在對(duì)窄表中那個(gè)代碼字段的操作。這種情況,窄表是輸入,寬表是輸出,寬表的粒度必定要比窄表粗一些,就粗在那個(gè)代碼字段上。
4、聚集。數(shù)據(jù)倉(cāng)庫(kù)中重要的任務(wù)就是沉淀數(shù)據(jù),聚集是必不可少的操作,它是粗化數(shù)據(jù)粒度的過(guò)程。聚集本身其實(shí)很簡(jiǎn)單,就是類似SQL中Group by的操作,選取特定字段(維度),對(duì)度量字段再使用某種聚集函數(shù)。但是對(duì)于大數(shù)據(jù)量情況下,聚集算法的優(yōu)化仍是探究的一個(gè)課題。例如是直接使用SQL的Group by,還是先排序,在處理。
二、微觀規(guī)則
從數(shù)據(jù)的轉(zhuǎn)換的微觀細(xì)節(jié)分,可以分成下面的幾個(gè)基本類型,當(dāng)然還有一些復(fù)雜的組合情況,例如先運(yùn)算,在參照轉(zhuǎn)換的規(guī)則,這種基于基本類型組合的情況就不在此列了。ETL的規(guī)則是依賴目標(biāo)數(shù)據(jù)的,目標(biāo)數(shù)據(jù)有多少字段,就有多少條規(guī)則。
1、直接映射,原來(lái)是什么就是什么,原封不動(dòng)照搬過(guò)來(lái),對(duì)這樣的規(guī)則,如果數(shù)據(jù)源字段和目標(biāo)字段長(zhǎng)度或精度不符,需要特別注意看是否真的可以直接映射還是需要做一些簡(jiǎn)單運(yùn)算。
2、字段運(yùn)算,數(shù)據(jù)源的一個(gè)或多個(gè)字段進(jìn)行數(shù)學(xué)運(yùn)算得到的目標(biāo)字段,這種規(guī)則一般對(duì)數(shù)值型字段而言。
3、參照轉(zhuǎn)換,在轉(zhuǎn)換中通常要用數(shù)據(jù)源的一個(gè)或多個(gè)字段作為Key,去一個(gè)關(guān)聯(lián)數(shù)組中去搜索特定值,而且應(yīng)該只能得到唯一值。這個(gè)關(guān)聯(lián)數(shù)組使用Hash算法實(shí)現(xiàn)是比較合適也是最常見(jiàn)的,在整個(gè)ETL開(kāi)始之前,它就裝入內(nèi)存,對(duì)性能提高的幫助非常大。
4、字符串處理,從數(shù)據(jù)源某個(gè)字符串字段中經(jīng)常可以獲取特定信息,例如身份證號(hào)。而且,經(jīng)常會(huì)有數(shù)值型值以字符串形式體現(xiàn)。對(duì)字符串的操作通常有類型轉(zhuǎn)換、字符串截取等。但是由于字符類型字段的隨意性也造成了臟數(shù)據(jù)的隱患,所以在處理這種規(guī)則的時(shí)候,一定要加上異常處理。
5、空值判斷,對(duì)于空值的處理是數(shù)據(jù)倉(cāng)庫(kù)中一個(gè)常見(jiàn)問(wèn)題,是將它作為臟數(shù)據(jù)還是作為特定一種維成員?這恐怕還要看應(yīng)用的情況,也是需要進(jìn)一步探求的。但是無(wú)論怎樣,對(duì)于可能有NULL值的字段,不要采用“直接映射”的規(guī)則類型,必須對(duì)空值進(jìn)行判斷,目前我們的建議是將它轉(zhuǎn)換成特定的值。
6、日期轉(zhuǎn)換,在數(shù)據(jù)倉(cāng)庫(kù)中日期值一般都會(huì)有特定的,不同于日期類型值的表示方法,例如使用8位整型20040801表示日期。而在數(shù)據(jù)源中,這種字段基本都是日期類型的,所以對(duì)于這樣的規(guī)則,需要一些共通函數(shù)來(lái)處理將日期轉(zhuǎn)換為8位日期值、6位月份值等。
7、日期運(yùn)算,基于日期,我們通常會(huì)計(jì)算日差、月差、時(shí)長(zhǎng)等。一般數(shù)據(jù)庫(kù)提供的日期運(yùn)算函數(shù)都是基于日期型的,而在數(shù)據(jù)倉(cāng)庫(kù)中采用特定類型來(lái)表示日期的話,必須有一套自己的日期運(yùn)算函數(shù)集。
8、聚集運(yùn)算,對(duì)于事實(shí)表中的度量字段,他們通常是通過(guò)數(shù)據(jù)源一個(gè)或多個(gè)字段運(yùn)用聚集函數(shù)得來(lái)的,這些聚集函數(shù)為SQL標(biāo)準(zhǔn)中,包括sum,count,avg,min,max。
9、既定取值,這種規(guī)則和以上各種類型規(guī)則的差別就在于它不依賴于數(shù)據(jù)源字段,對(duì)目標(biāo)字段取一個(gè)固定的或是依賴系統(tǒng)的值。
探求ETL本質(zhì)之四(數(shù)據(jù)質(zhì)量)
“不要絕對(duì)的數(shù)據(jù)準(zhǔn)確,但要知道為什么不準(zhǔn)確?!?/p>
這是我們?cè)跇?gòu)建BI系統(tǒng)是對(duì)數(shù)據(jù)準(zhǔn)確性的要求。確實(shí),對(duì)絕對(duì)的數(shù)據(jù)準(zhǔn)確誰(shuí)也沒(méi)有把握,不僅是系統(tǒng)集成商,包括客戶也是無(wú)法確定。準(zhǔn)確的東西需要一個(gè)標(biāo)準(zhǔn),但首先要保證這個(gè)標(biāo)準(zhǔn)是準(zhǔn)確的,至少現(xiàn)在還沒(méi)有這樣一個(gè)標(biāo)準(zhǔn)??蛻魰?huì)提出一個(gè)相對(duì)標(biāo)準(zhǔn),例如將你的OLAP數(shù)據(jù)結(jié)果和報(bào)表結(jié)果對(duì)比。雖然這是一種不太公平的比較,你也只好認(rèn)了吧。
首先在數(shù)據(jù)源那里,已經(jīng)很難保證數(shù)據(jù)質(zhì)量了,這一點(diǎn)也是事實(shí)。在這一層有哪些可能原因?qū)е聰?shù)據(jù)質(zhì)量問(wèn)題?可以分為下面幾類:
1、數(shù)據(jù)格式錯(cuò)誤,例如缺失數(shù)據(jù)、數(shù)據(jù)值超出范圍或是數(shù)據(jù)格式非法等。要知道對(duì)于同樣處理大數(shù)據(jù)量的數(shù)據(jù)源系統(tǒng),他們通常會(huì)舍棄一些數(shù)據(jù)庫(kù)自身的檢查機(jī)制,例如字段約束等。他們盡可能將數(shù)據(jù)檢查在入庫(kù)前保證,但是這一點(diǎn)是很難確保的。這類情況諸如身份證號(hào)碼、手機(jī)號(hào)、非日期類型的日期字段等。
2、數(shù)據(jù)一致性,同樣,數(shù)據(jù)源系統(tǒng)為了性能的考慮,會(huì)在一定程度上舍棄外鍵約束,這通常會(huì)導(dǎo)致數(shù)據(jù)不一致。例如在帳務(wù)表中會(huì)出現(xiàn)一個(gè)用戶表中沒(méi)有的用戶ID,在例如有些代碼在代碼表中找不到等。
3、業(yè)務(wù)邏輯的合理性,這一點(diǎn)很難說(shuō)對(duì)與錯(cuò)。通常,數(shù)據(jù)源系統(tǒng)的設(shè)計(jì)并不是非常嚴(yán)謹(jǐn),例如讓用戶開(kāi)戶日期晚于用戶銷戶日期都是有可能發(fā)生的,一個(gè)用戶表中存在多個(gè)用戶ID也是有可能發(fā)生的。對(duì)這種情況,有什么辦法嗎?
構(gòu)建一個(gè)BI系統(tǒng),要做到完全理解數(shù)據(jù)源系統(tǒng)根本就是不可能的。特別是數(shù)據(jù)源系統(tǒng)在交付后,有更多維護(hù)人員的即興發(fā)揮,那更是要花大量的時(shí)間去尋找原因。以前曾經(jīng)爭(zhēng)辯過(guò)設(shè)計(jì)人員對(duì)規(guī)則描述的問(wèn)題,有人提出要在ETL開(kāi)始之前務(wù)必將所有的規(guī)則弄得一清二楚。我并不同意這樣的意見(jiàn),倒是認(rèn)為在ETL過(guò)程要有處理這些質(zhì)量有問(wèn)題數(shù)據(jù)的保證。一定要正面這些臟數(shù)據(jù),是丟棄還是處理,無(wú)法逃避。如果沒(méi)有質(zhì)量保證,那么在這個(gè)過(guò)程中,錯(cuò)誤會(huì)逐漸放大,拋開(kāi)數(shù)據(jù)源質(zhì)量問(wèn)題,我們?cè)賮?lái)看看ETL過(guò)程中哪些因素對(duì)數(shù)據(jù)準(zhǔn)確性產(chǎn)生重大影響。
1、規(guī)則描述錯(cuò)誤。上面提到對(duì)設(shè)計(jì)人員對(duì)數(shù)據(jù)源系統(tǒng)理解的不充分,導(dǎo)致規(guī)則理解錯(cuò)誤,這是一方面。另一方面,是規(guī)則的描述,如果無(wú)二義性地描述規(guī)則也是要探求的一個(gè)課題。規(guī)則是依附于目標(biāo)字段的,在探求之三中,提到規(guī)則的分類。但是規(guī)則總不能總是用文字描述,必須有嚴(yán)格的數(shù)學(xué)表達(dá)方式。我甚至想過(guò),如果設(shè)計(jì)人員能夠使用某種規(guī)則語(yǔ)言來(lái)描述,那么我們的ETL單元就可以自動(dòng)生成、同步,省去很多手工操作了。
2、ETL開(kāi)發(fā)錯(cuò)誤。即時(shí)規(guī)則很明確,ETL開(kāi)發(fā)的過(guò)程中也會(huì)發(fā)生一些錯(cuò)誤,例如邏輯錯(cuò)誤、書寫錯(cuò)誤等。例如對(duì)于一個(gè)分段值,開(kāi)區(qū)間閉區(qū)間是需要指定的,但是常常開(kāi)發(fā)人員沒(méi)注意,一個(gè)大于等于號(hào)寫成大于號(hào)就導(dǎo)致數(shù)據(jù)錯(cuò)誤。
3、人為處理錯(cuò)誤。在整體ETL流程沒(méi)有完成之前,為了圖省事,通常會(huì)手工運(yùn)行ETL過(guò)程,這其中一個(gè)重大的問(wèn)題就是你不會(huì)按照正常流程去運(yùn)行了,而是按照自己的理解去運(yùn)行,發(fā)生的錯(cuò)誤可能是誤刪了數(shù)據(jù)、重復(fù)裝載數(shù)據(jù)等。
探求ETL本質(zhì)之五(質(zhì)量保證)
上回提到ETL數(shù)據(jù)質(zhì)量問(wèn)題,這是無(wú)法根治的,只能采取特定的手段去盡量避免,而且必須要定義出度量方法來(lái)衡量數(shù)據(jù)的質(zhì)量是好還是壞。對(duì)于數(shù)據(jù)源的質(zhì)量,客戶對(duì)此應(yīng)該更加關(guān)心,如果在這個(gè)源頭不能保證比較干凈的數(shù)據(jù),那么后面的分析功能的可信度也都成問(wèn)題。數(shù)據(jù)源系統(tǒng)也在不斷進(jìn)化過(guò)程中,客戶的操作也在逐漸規(guī)范中,BI系統(tǒng)也同樣如此。本文探討一下對(duì)數(shù)據(jù)源質(zhì)量和ETL處理質(zhì)量的應(yīng)對(duì)方法。
如何應(yīng)對(duì)數(shù)據(jù)源的質(zhì)量問(wèn)題?記得在onteldatastage列表中也討論過(guò)一個(gè)話題-“-1的處理”,在數(shù)據(jù)倉(cāng)庫(kù)模型維表中,通常有一條-1記錄,表示“未知”,這個(gè)未知含義可廣了,任何可能出錯(cuò)的數(shù)據(jù),NULL數(shù)據(jù)甚至是規(guī)則沒(méi)有涵蓋到的數(shù)據(jù),都轉(zhuǎn)成-1。這是一種處理臟數(shù)據(jù)的方法,但這也是一種掩蓋事實(shí)的方法。就好像寫一個(gè)函數(shù)FileOpen(filename),返回一個(gè)錯(cuò)誤碼,當(dāng)然,你可以只返回一種錯(cuò)誤碼,如-1,但這是一種不好的設(shè)計(jì),對(duì)于調(diào)用者來(lái)說(shuō),他需要依據(jù)這個(gè)錯(cuò)誤碼進(jìn)行某些判斷,例如是文件不存在,還是讀取權(quán)限不夠,都有相應(yīng)的處理邏輯。數(shù)據(jù)倉(cāng)庫(kù)中也是一樣,所以,建議將不同的數(shù)據(jù)質(zhì)量類型處理結(jié)果分別轉(zhuǎn)換成不同的值,譬如,在轉(zhuǎn)換后,-1表示參照不上,-2表示NULL數(shù)據(jù)等。不過(guò)這僅僅對(duì)付了上回提到的第一類錯(cuò)誤,數(shù)據(jù)格式錯(cuò)誤。對(duì)于數(shù)據(jù)一致性和業(yè)務(wù)邏輯合理性問(wèn)題,這仍有待探求。但這里有一個(gè)原則就是“必須在數(shù)據(jù)倉(cāng)庫(kù)中反應(yīng)數(shù)據(jù)源的質(zhì)量”。
對(duì)于ETL過(guò)程中產(chǎn)生的質(zhì)量問(wèn)題,必須有保障手段。從以往的經(jīng)驗(yàn)看,沒(méi)有保障手段給實(shí)施人員帶來(lái)麻煩重重。實(shí)施人員對(duì)于反復(fù)裝載數(shù)據(jù)一定不會(huì)陌生,甚至是最后數(shù)據(jù)留到最后的Cube,才發(fā)現(xiàn)了第一步ETL其實(shí)已經(jīng)錯(cuò)了。這個(gè)保障手段就是數(shù)據(jù)驗(yàn)證機(jī)制,當(dāng)然,它的目的是能夠在ETL過(guò)程中監(jiān)控?cái)?shù)據(jù)質(zhì)量,產(chǎn)生報(bào)警。這個(gè)模塊要將實(shí)施人員當(dāng)作是最終用戶,可以說(shuō)他們是數(shù)據(jù)驗(yàn)證機(jī)制的直接收益者。
首先,必須有一個(gè)對(duì)質(zhì)量的度量方法,什么是高質(zhì)什么是低質(zhì),不能靠感官感覺(jué),但這卻是在沒(méi)有度量方法條件下通常的做法。那經(jīng)營(yíng)分析系統(tǒng)來(lái)說(shuō),聯(lián)通總部曾提出測(cè)試規(guī)范,這其實(shí)就是一種度量方法,例如指標(biāo)的誤差范圍不能高于5%等,對(duì)系統(tǒng)本身來(lái)說(shuō)其實(shí)必須要有這樣的度量方法,先不要說(shuō)這個(gè)度量方法是否科學(xué)。對(duì)于ETL數(shù)據(jù)處理質(zhì)量,他的度量方法應(yīng)該比聯(lián)通總部測(cè)試規(guī)范定義的方法更要嚴(yán)格,因?yàn)樗鄬I系統(tǒng)看作一個(gè)黑盒子,從數(shù)據(jù)源到展現(xiàn)的數(shù)據(jù)誤差允許一定的誤差。而ETL數(shù)據(jù)處理質(zhì)量度量是一種白盒的度量,要注重每一步過(guò)程。因此理論上,要求輸入輸出的指標(biāo)應(yīng)該完全一致。但是我們必須正面完全一致只是理想,對(duì)于有誤差的數(shù)據(jù),必須找到原因。
在質(zhì)量度量方法的前提下,就可以建立一個(gè)數(shù)據(jù)驗(yàn)證框架。此框架依據(jù)總量、分量數(shù)據(jù)稽核方法,該方法在高的《數(shù)據(jù)倉(cāng)庫(kù)中的數(shù)據(jù)稽核技術(shù)》一文中已經(jīng)指出。作為補(bǔ)充,下面提出幾點(diǎn)功能上的建議:
1、提供前端。將開(kāi)發(fā)實(shí)施人員當(dāng)作用戶,同樣也要為之提供友好的用戶界面?!痘思夹g(shù)》一文中指出測(cè)試報(bào)告的形式,這種形式還是要依賴人為判斷,在一堆數(shù)據(jù)中去找規(guī)律。到不如用OLAP的方式提供界面,不光是加上測(cè)試統(tǒng)計(jì)出來(lái)的指標(biāo)結(jié)果,并且配合度量方法的計(jì)算。例如誤差率,對(duì)于誤差率為大于0的指標(biāo),就要好好查一下原因了。
2、提供框架。數(shù)據(jù)驗(yàn)證不是一次性工作,而是每次ETL過(guò)程中都必須做的。因此,必須有一個(gè)框架,自動(dòng)化驗(yàn)證過(guò)程,并提供擴(kuò)展手段,讓實(shí)施人員能夠增加驗(yàn)證范圍。有了這樣一個(gè)框架,其實(shí)它起到規(guī)范化操作的作用,開(kāi)發(fā)實(shí)施人員可以將主要精力放在驗(yàn)證腳本的編寫上,而不必過(guò)多關(guān)注驗(yàn)證如何融合到流程中,如何展現(xiàn)等工作。為此,要設(shè)計(jì)一套表,類似于DM表,每次驗(yàn)證結(jié)果數(shù)據(jù)都記錄其中,并且自動(dòng)觸發(fā)多維分析的數(shù)據(jù)裝載、發(fā)布等。這樣,實(shí)施人員可以在每次裝載,甚至在流程過(guò)程中就可以觀察數(shù)據(jù)的誤差率。特別是,如果數(shù)據(jù)倉(cāng)庫(kù)的模型能夠統(tǒng)一起來(lái),甚至數(shù)據(jù)驗(yàn)證腳本都可以確定下來(lái),剩下的就是規(guī)范流程了。
3、規(guī)范流程。上回提到有一種ETL數(shù)據(jù)質(zhì)量問(wèn)題是由于人工處理導(dǎo)致的,其中最主要原因還是流程不規(guī)范。開(kāi)發(fā)實(shí)施人員運(yùn)行單獨(dú)一個(gè)ETL單元是很方便的,雖然以前曾建議一個(gè)ETL單元必須是“可重入”的,這能夠解決誤刪數(shù)據(jù),重復(fù)裝載數(shù)據(jù)問(wèn)題。但要記住數(shù)據(jù)驗(yàn)證也是在流程當(dāng)中,要讓數(shù)據(jù)驗(yàn)證能夠日常運(yùn)作,就不要讓實(shí)施者感覺(jué)到他的存在??偟膩?lái)說(shuō),規(guī)范流程是提高實(shí)施效率的關(guān)鍵工作,這也是以后要繼續(xù)探求的。
探求ETL本質(zhì)之六(元數(shù)據(jù)漫談)
對(duì)于元數(shù)據(jù)(Metadata)的定義到目前為止沒(méi)有什么特別精彩的,這個(gè)概念非常廣,一般都是這樣定義,“元數(shù)據(jù)是描述數(shù)據(jù)的數(shù)據(jù)(Data about Data)”,這造成一種遞歸定義,就像問(wèn)小強(qiáng)住在哪里,答,在旺財(cái)隔壁。按照這樣的定義,元數(shù)據(jù)所描述的數(shù)據(jù)是什么呢?還是元數(shù)據(jù)。這樣就可能有元元元...元數(shù)據(jù)。我還聽(tīng)說(shuō)過(guò)一種對(duì)元數(shù)據(jù),如果說(shuō)數(shù)據(jù)是一抽屜檔案,那么元數(shù)據(jù)就是分類標(biāo)簽。那它和索引有什么區(qū)別?
元數(shù)據(jù)體現(xiàn)是一種抽象,哲學(xué)家從古至今都在抽象這個(gè)世界,力圖找到世界的本質(zhì)。抽象不是一層關(guān)系,它是一種逐步由具體到一般的過(guò)程。例如我->男人->人->哺乳動(dòng)物->生物這就是一個(gè)抽象過(guò)程,你要是在軟件業(yè)混會(huì)發(fā)現(xiàn)這個(gè)例子很常見(jiàn),面向?qū)ο蠓椒ň褪沁@樣一種抽象過(guò)程。它對(duì)世界中的事物、過(guò)程進(jìn)行抽象,使用面向?qū)ο蠓椒?,?gòu)建一套對(duì)象模型。同樣在面向?qū)ο蠓椒ㄖ?,類是?duì)象的抽象,接口又是對(duì)類的抽象。因此,我認(rèn)為可以將“元”和“抽象”換一下,叫抽象數(shù)據(jù)是不是好理解一些。常聽(tīng)到這樣的話,“xx領(lǐng)導(dǎo)的講話高屋建瓴,給我們后面的工作指引的清晰的方向”,這個(gè)成語(yǔ)“高屋建瓴”,站在10樓往下到水,居高臨下,能砸死人,這是指站在一定的高度看待事物,這個(gè)一定的高度就是指他有夠“元”。在設(shè)計(jì)模式中,強(qiáng)調(diào)要對(duì)接口編程,就是說(shuō)你不要處理這類對(duì)象和那類對(duì)象的交互,而要處理這個(gè)接口和那個(gè)接口的交互,先別管他們內(nèi)部是怎么干的。
元數(shù)據(jù)存在的意義也在于此,雖然上面說(shuō)了一通都撤到哲學(xué)上去,但這個(gè)詞必須還是要結(jié)合軟件設(shè)計(jì)中看,我不知道在別的領(lǐng)域是不是存在Metadata這樣的叫法,雖然我相信別的領(lǐng)域必然有類似的東東。元數(shù)據(jù)的存在就是要做到在更高抽象一層設(shè)計(jì)軟件。這肯定有好處,什么靈活性啊,擴(kuò)展性啊,可維護(hù)性啊,都能得到提高,而且架構(gòu)清晰,只是彎彎太多,要是從下往上看,太復(fù)雜了。很早以前,我曾看過(guò)backorifice的代碼,我靠,一個(gè)簡(jiǎn)單的功能,從這個(gè)類轉(zhuǎn)到父類,又轉(zhuǎn)到父類,很不理解,為什么一個(gè)簡(jiǎn)單的功能不在一個(gè)類的方法中實(shí)現(xiàn)就拉到了呢?現(xiàn)在想想,還真不能這樣,這雖然使代碼容易看懂了,但是結(jié)構(gòu)確實(shí)混亂的,那他只能干現(xiàn)在的事,如果有什么功能擴(kuò)展,這些代碼就廢了。
我從98年剛工作時(shí)就開(kāi)始接觸元數(shù)據(jù)的概念,當(dāng)時(shí)叫做元數(shù)據(jù)驅(qū)動(dòng)的系統(tǒng)架構(gòu),后來(lái)在QiDSS中也用到這個(gè)概念構(gòu)建QiNavigator,但是現(xiàn)在覺(jué)得元數(shù)據(jù)也沒(méi)啥,不就是建一堆表描述界面的元素,再利用這些數(shù)據(jù)自動(dòng)生成界面嗎。到了數(shù)據(jù)倉(cāng)庫(kù)系統(tǒng)中,這個(gè)概念更強(qiáng)了,是數(shù)據(jù)倉(cāng)庫(kù)中一個(gè)重要的部分。但是至今,我還是認(rèn)為這個(gè)概念過(guò)于玄乎,看不到實(shí)際的東西,市面上有一些元數(shù)據(jù)管理的東西,但是從應(yīng)用情況就得知,用的不多。之所以玄乎,就是因?yàn)槌橄髮哟螞](méi)有分清楚,關(guān)鍵就是對(duì)于元數(shù)據(jù)的分類(這種分類就是一種抽象過(guò)程)和元數(shù)據(jù)的使用。你可以將元數(shù)據(jù)抽象成0和1,但是那樣對(duì)你的業(yè)務(wù)有用嗎?必須還得抽象到適合的程度,最后問(wèn)題還是“度”。
數(shù)據(jù)倉(cāng)庫(kù)系統(tǒng)的元數(shù)據(jù)作用如何?還不就是使系統(tǒng)自動(dòng)運(yùn)轉(zhuǎn),易于管理嗎?要做到這一步,可沒(méi)必要將系統(tǒng)抽象到太極、兩儀、八卦之類的,業(yè)界也曾定義過(guò)一些元數(shù)據(jù)規(guī)范,向CWM、XMI等等,可以借鑒,不過(guò)俺對(duì)此也是不精通的說(shuō),以后再說(shuō)
第二篇:ETL學(xué)習(xí)心得
ETL學(xué)習(xí)心得:探求數(shù)據(jù)倉(cāng)庫(kù)關(guān)鍵環(huán)節(jié)ETL的本質(zhì)
元數(shù)據(jù)是描述數(shù)據(jù)的數(shù)據(jù),他的含義非常廣泛,這里僅指ETL的元數(shù)據(jù)。11 : 10 探求ETL本質(zhì)之六(元數(shù)據(jù)漫談)對(duì)于元數(shù)據(jù)(Metadata)的定義到目前為止沒(méi)有什么特別精彩的,這個(gè)概念非常廣,一般都是這樣定義,“元數(shù)據(jù)
做數(shù)據(jù)倉(cāng)庫(kù)系統(tǒng),ETL是關(guān)鍵的一環(huán)。說(shuō)大了,ETL是數(shù)據(jù)整合解決方案,說(shuō)小了,就是倒數(shù)據(jù)的工具?;貞浺幌鹿ぷ鬟@么些年來(lái),處理數(shù)據(jù)遷移、轉(zhuǎn)換的工作倒還真的不少。但是那些工作基本上是一次性工作或者很小數(shù)據(jù)量,使用access、DTS或是自己編個(gè)小程序搞定??墒窃跀?shù)據(jù)倉(cāng)庫(kù)系統(tǒng)中,ETL上升到了一定的理論高度,和原來(lái)小打小鬧的工具使用不同了。究竟什么不同,從名字上就可以看到,人家已經(jīng)將倒數(shù)據(jù)的過(guò)程分成3個(gè)步驟,E、T、L分別代表抽取、轉(zhuǎn)換和裝載。
其實(shí)ETL過(guò)程就是數(shù)據(jù)流動(dòng)的過(guò)程,從不同的數(shù)據(jù)源流向不同的目標(biāo)數(shù)據(jù)。但在數(shù)據(jù)倉(cāng)庫(kù)中,ETL有幾個(gè)特點(diǎn),一是數(shù)據(jù)同步,它不是一次性倒完數(shù)據(jù)就拉到,它是經(jīng)常性的活動(dòng),按照固定周期運(yùn)行的,甚至現(xiàn)在還有人提出了實(shí)時(shí)ETL的概念。二是數(shù)據(jù)量,一般都是巨大的,值得你將數(shù)據(jù)流動(dòng)的過(guò)程拆分成E、T和L。
現(xiàn)在有很多成熟的工具提供ETL功能,例如datastage、powermart等,且不說(shuō)他們的好壞。從應(yīng)用角度來(lái)說(shuō),ETL的過(guò)程其實(shí)不是非常復(fù)雜,這些工具給數(shù)據(jù)倉(cāng)庫(kù)工程帶來(lái)和很大的便利性,特別是開(kāi)發(fā)的便利和維護(hù)的便利。但另一方面,開(kāi)發(fā)人員容易迷失在這些工具中。舉個(gè)例子,VB是一種非常簡(jiǎn)單的語(yǔ)言并且也是非常易用的編程工具,上手特別快,但是真正VB的高手有多少?微軟設(shè)計(jì)的產(chǎn)品通常有個(gè)原則是“將使用者當(dāng)作傻瓜”,在這個(gè)原則下,微軟的東西確實(shí)非常好用,但是對(duì)于開(kāi)發(fā)者,如果你自己也將自己當(dāng)作傻瓜,那就真的傻了。ETL工具也是一樣,這些工具為我們提供圖形化界面,讓我們將主要的精力放在規(guī)則上,以期提高開(kāi)發(fā)效率。從使用效果來(lái)說(shuō),確實(shí)使用這些工具能夠非常快速地構(gòu)建一個(gè)job來(lái)處理某個(gè)數(shù)據(jù),不過(guò)從整體來(lái)看,并不見(jiàn)得他的整體效率會(huì)高多少。問(wèn)題主要不是出在工具上,而是在設(shè)計(jì)、開(kāi)發(fā)人員上。他們迷失在工具中,沒(méi)有去探求ETL的本質(zhì)。
可以說(shuō)這些工具應(yīng)用了這么長(zhǎng)時(shí)間,在這么多項(xiàng)目、環(huán)境中應(yīng)用,它必然有它成功之處,它必定體現(xiàn)了ETL的本質(zhì)。如果我們不透過(guò)表面這些工具的簡(jiǎn)單使用去看它背后蘊(yùn)涵的思想,最終我們作出來(lái)的東西也就是一個(gè)個(gè)獨(dú)立的job,將他們整合起來(lái)仍然有巨大的工作量。大家都知道“理論與實(shí)踐相結(jié)合”,如果在一個(gè)領(lǐng)域有所超越,必須要在理論水平上達(dá)到一定的高度
探求ETL本質(zhì)之一
ETL的過(guò)程就是數(shù)據(jù)流動(dòng)的過(guò)程,從不同異構(gòu)數(shù)據(jù)源流向統(tǒng)一的目標(biāo)數(shù)據(jù)。其間,數(shù)據(jù)的抽取、清洗、轉(zhuǎn)換和裝載形成串行或并行的過(guò)程。ETL的核心還是在于T這個(gè)過(guò)程,也就是轉(zhuǎn)換,而抽取和裝載一般可以作為轉(zhuǎn)換的輸入和輸出,或者,它們作為一個(gè)單獨(dú)的部件,其復(fù)雜度沒(méi)有轉(zhuǎn)換部件高。和OLTP系統(tǒng)中不同,那里充滿這單條記錄的insert、update和select等操作,ETL過(guò)程一般都是批量操作,例如它的裝載多采用批量裝載工具,一般都是DBMS系統(tǒng)自身附帶的工具,例如Oracle SQLLoader和DB2的autoloader等。
ETL本身有一些特點(diǎn),在一些工具中都有體現(xiàn),下面以datastage和powermart舉例來(lái)說(shuō)。
1、靜態(tài)的ETL單元和動(dòng)態(tài)的ETL單元實(shí)例;一次轉(zhuǎn)換指明了某種格式的數(shù)據(jù)如何格式化成另一種格式的數(shù)據(jù),對(duì)于數(shù)據(jù)源的物理形式在設(shè)計(jì)時(shí)可以不用指定,它可以在運(yùn)行時(shí),當(dāng)這個(gè)ETL單元?jiǎng)?chuàng)建一個(gè)實(shí)例時(shí)才指定。對(duì)于靜態(tài)和動(dòng)態(tài)的ETL單元,Datastage沒(méi)有嚴(yán)格區(qū)分,它的一個(gè)Job就是實(shí)現(xiàn)這個(gè)功能,在早期版本,一個(gè)Job同時(shí)不能運(yùn)行兩次,所以一個(gè)Job相當(dāng)于一個(gè)實(shí)例,在后期版本,它支持multiple instances,而且還不是默認(rèn)選項(xiàng)。Powermart中將這兩個(gè)概念加以區(qū)分,靜態(tài)的叫做Mapping,動(dòng)態(tài)運(yùn)行時(shí)叫做Session。
2、ETL元數(shù)據(jù);元數(shù)據(jù)是描述數(shù)據(jù)的數(shù)據(jù),他的含義非常廣泛,這里僅指ETL的元數(shù)據(jù)。主要包括每次轉(zhuǎn)換前后的數(shù)據(jù)結(jié)構(gòu)和轉(zhuǎn)換的規(guī)則。ETL元數(shù)據(jù)還包括形式參數(shù)的管理,形式參數(shù)的ETL單元定義的參數(shù),相對(duì)還有實(shí)參,它是運(yùn)行時(shí)指定的參數(shù),實(shí)參不在元數(shù)據(jù)管理范圍之內(nèi)。
3、數(shù)據(jù)流程的控制;要有可視化的流程編輯工具,提供流程定義和流程監(jiān)控功能。流程調(diào)度的最小單位是ETL單元實(shí)例,ETL單元是不能在細(xì)分的ETL過(guò)程,當(dāng)然這由開(kāi)發(fā)者來(lái)控制,例如可以將抽取、轉(zhuǎn)換放在一個(gè)ETL單元中,那樣這個(gè)抽取和轉(zhuǎn)換只能同時(shí)運(yùn)行,而如果將他們分作兩個(gè)單元,可以分別運(yùn)行,這有利于錯(cuò)誤恢復(fù)操作。當(dāng)然,ETL單元究竟應(yīng)該細(xì)分到什么程度應(yīng)該依據(jù)具體應(yīng)用來(lái)看,目前還沒(méi)有找到很好的細(xì)分策略。比如,我們可以規(guī)定將裝載一個(gè)表的功能作為一個(gè)ETL單元,但是不可否認(rèn),這樣的ETL單元之間會(huì)有很多共同的操作,例如兩個(gè)單元共用一個(gè)Hash表,要將這個(gè)Hash表裝入內(nèi)存兩次。
4、轉(zhuǎn)換規(guī)則的定義方法;提供函數(shù)集提供常用規(guī)則方法,提供規(guī)則定義語(yǔ)言描述規(guī)則。
5、對(duì)數(shù)據(jù)的快速索引;一般都是利用Hash技術(shù),將參照關(guān)系表提前裝入內(nèi)存,在轉(zhuǎn)換時(shí)查找這個(gè)hash表。Datastage中有Hash文件技術(shù),Powermart也有類似的Lookup功能。
探求ETL本質(zhì)之二(分類)
昨在IT-Director上閱讀一篇報(bào)告,關(guān)于ETL產(chǎn)品分類的。一般來(lái)說(shuō),我們眼中的ETL工具都是價(jià)格昂貴,能夠處理海量數(shù)據(jù)的家伙,但是這是其中的一種。它可以分成4種,針對(duì)不同的需求,主要是從轉(zhuǎn)換規(guī)則的復(fù)雜度和數(shù)據(jù)量大小來(lái)看。它們包括
1、交互式運(yùn)行環(huán)境,你可以指定數(shù)據(jù)源、目標(biāo)數(shù)據(jù),指定規(guī)則,立馬ETL。這種交互式的操作無(wú)疑非常方便,但是只能適合小數(shù)據(jù)量和復(fù)雜度不高的ETL過(guò)程,因?yàn)橐坏┮?guī)則復(fù)雜了,可能需要語(yǔ)言級(jí)的描述,不能簡(jiǎn)簡(jiǎn)單單拖拖拽拽就可以的。還有數(shù)據(jù)量的問(wèn)題,這種交互式必然建立在解釋型語(yǔ)言基礎(chǔ)上,另外他的靈活性必然要犧牲一定的性能為代價(jià)。所以如果要處理海量數(shù)據(jù)的話,每次讀取一條記錄,每次對(duì)規(guī)則進(jìn)行解釋執(zhí)行,每次在寫入一條記錄,這對(duì)性能影響是非常大的。
2、專門編碼型的,它提供了一個(gè)基于某種語(yǔ)言的程序框架,你可以不必將編程精力放在一些周邊的功能上,例如讀文件功能、寫數(shù)據(jù)庫(kù)的功能,而將精力主要放在規(guī)則的實(shí)現(xiàn)上面。這種近似手工代碼的性能肯定是沒(méi)話說(shuō),除非你的編程技巧不過(guò)關(guān)(這也是不可忽視的因素之一)。對(duì)于處理大數(shù)據(jù)量,處理復(fù)雜轉(zhuǎn)換邏輯,這種方式的ETL實(shí)現(xiàn)是非常直觀的。
3、代碼生成器型的,它就像是一個(gè)ETL代碼生成器,提供簡(jiǎn)單的圖形化界面操作,讓你拖拖拽拽將轉(zhuǎn)換規(guī)則都設(shè)定好,其實(shí)他的后臺(tái)都是生成基于某種語(yǔ)言的程序,要運(yùn)行這個(gè)ETL過(guò)程,必須要編譯才行。Datastage就是類似這樣的產(chǎn)品,設(shè)計(jì)好的job必須要編譯,這避免了每次轉(zhuǎn)換的解釋執(zhí)行,但是不知道它生成的中間語(yǔ)言是什么。以前我設(shè)計(jì)的ETL工具大挪移其實(shí)也是歸屬于這一類,它提供了界面讓用戶編寫規(guī)則,最后生成C++語(yǔ)言,編譯后即可運(yùn)行。這類工具的特點(diǎn)就是要在界面上下狠功夫,必須讓用戶輕松定義一個(gè)ETL過(guò)程,提供豐富的插件來(lái)完成讀、寫和轉(zhuǎn)換函數(shù)。大挪移在這方面就太弱了,規(guī)則必須手寫,而且要寫成標(biāo)準(zhǔn)c++語(yǔ)法,這未免還是有點(diǎn)難為最終用戶了,還不如做成一個(gè)專業(yè)編碼型的產(chǎn)品呢。另外一點(diǎn),這類工具必須提供面向?qū)<覒?yīng)用的功能,因?yàn)樗豢赡芸紤]到所有的轉(zhuǎn)換規(guī)則和所有的讀寫,一方面提供插件接口來(lái)讓第三方編寫特定的插件,另一方面還有提供特定語(yǔ)言來(lái)實(shí)現(xiàn)高級(jí)功能。例如Datastage提供一種類Basic的語(yǔ)言,不過(guò)他的Job的腳本化實(shí)現(xiàn)好像就做的不太好,只能手工繪制job,而不能編程實(shí)現(xiàn)Job。
4、最后還有一種類型叫做數(shù)據(jù)集線器,顧名思義,他就是像Hub一樣地工作。將這種類型分出來(lái)和上面幾種分類在標(biāo)準(zhǔn)上有所差異,上面三種更多指ETL實(shí)現(xiàn)的方法,此類主要從數(shù)據(jù)處理角度。目前有一些產(chǎn)品屬于EAI(Enterprise Application Integration),它的數(shù)據(jù)集成主要是一種準(zhǔn)實(shí)時(shí)性。所以這類產(chǎn)品就像Hub一樣,不斷接收各種異構(gòu)數(shù)據(jù)源來(lái)的數(shù)據(jù),經(jīng)過(guò)處理,在實(shí)施發(fā)送到不同的目標(biāo)數(shù)據(jù)中去。
雖然,這些類看似各又千秋,特別在BI項(xiàng)目中,面對(duì)海量數(shù)據(jù)的ETL時(shí),中間兩種的選擇就開(kāi)始了,在選擇過(guò)程中,必須要考慮到開(kāi)發(fā)效率、維護(hù)方面、性能、學(xué)習(xí)曲線、人員技能等各方面因素,當(dāng)然還有最重要也是最現(xiàn)實(shí)的因素就是客戶的意象。
探求ETL本質(zhì)之三(轉(zhuǎn)換)
ETL探求之一中提到,ETL過(guò)程最復(fù)雜的部分就是T,這個(gè)轉(zhuǎn)換過(guò)程,T過(guò)程究竟有哪些類型呢?
一、宏觀輸入輸出
從對(duì)數(shù)據(jù)源的整個(gè)宏觀處理分,看看一個(gè)ETL過(guò)程的輸入輸出,可以分成下面幾類:
1、大小交,這種處理在數(shù)據(jù)清洗過(guò)程是常見(jiàn)了,例如從數(shù)據(jù)源到ODS階段,如果數(shù)據(jù)倉(cāng)庫(kù)采用維度建模,而且維度基本采用代理鍵的話,必然存在代碼到此鍵值的轉(zhuǎn)換。如果用SQL實(shí)現(xiàn),必然需要將一個(gè)大表和一堆小表都Join起來(lái),當(dāng)然如果使用ETL工具的話,一般都是先將小表讀入內(nèi)存中再處理。這種情況,輸出數(shù)據(jù)的粒度和大表一樣。
2、大大交,大表和大表之間關(guān)聯(lián)也是一個(gè)重要的課題,當(dāng)然其中要有一個(gè)主表,在邏輯上,應(yīng)當(dāng)是主表Left Join輔表。大表之間的關(guān)聯(lián)存在最大的問(wèn)題就是性能和穩(wěn)定性,對(duì)于海量數(shù)據(jù)來(lái)說(shuō),必須有優(yōu)化的方法來(lái)處理他們的關(guān)聯(lián),另外,對(duì)于大數(shù)據(jù)的處理無(wú)疑會(huì)占用太多的系統(tǒng)資源,出錯(cuò)的幾率非常大,如何做到有效錯(cuò)誤恢復(fù)也是個(gè)問(wèn)題。對(duì)于這種情況,我們建議還是盡量將大表拆分成適度的稍小一點(diǎn)的表,形成大小交的類型。這類情況的輸出數(shù)據(jù)粒度和主表一樣。
3、站著進(jìn)來(lái),躺著出去。事務(wù)系統(tǒng)中為了提高系統(tǒng)靈活性和擴(kuò)展性,很多信息放在代碼表中維護(hù),所以它的“事實(shí)表”就是一種窄表,而在數(shù)據(jù)倉(cāng)庫(kù)中,通常要進(jìn)行寬化,從行變成列,所以稱這種處理情況叫做“站著進(jìn)來(lái),躺著出去”。大家對(duì)Decode肯定不陌生,這是進(jìn)行寬表化常見(jiàn)的手段之一。窄表變寬表的過(guò)程主要體現(xiàn)在對(duì)窄表中那個(gè)代碼字段的操作。這種情況,窄表是輸入,寬表是輸出,寬表的粒度必定要比窄表粗一些,就粗在那個(gè)代碼字段上。
4、聚集。數(shù)據(jù)倉(cāng)庫(kù)中重要的任務(wù)就是沉淀數(shù)據(jù),聚集是必不可少的操作,它是粗化數(shù)據(jù)粒度的過(guò)程。聚集本身其實(shí)很簡(jiǎn)單,就是類似SQL中Group by的操作,選取特定字段(維度),對(duì)度量字段再使用某種聚集函數(shù)。但是對(duì)于大數(shù)據(jù)量情況下,聚集算法的優(yōu)化仍是探究的一個(gè)課題。例如是直接使用SQL的Group by,還是先排序,在處理。
二、微觀規(guī)則
從數(shù)據(jù)的轉(zhuǎn)換的微觀細(xì)節(jié)分,可以分成下面的幾個(gè)基本類型,當(dāng)然還有一些復(fù)雜的組合情況,例如先運(yùn)算,在參照轉(zhuǎn)換的規(guī)則,這種基于基本類型組合的情況就不在此列了。ETL的規(guī)則是依賴目標(biāo)數(shù)據(jù)的,目標(biāo)數(shù)據(jù)有多少字段,就有多少條規(guī)則。
1、直接映射,原來(lái)是什么就是什么,原封不動(dòng)照搬過(guò)來(lái),對(duì)這樣的規(guī)則,如果數(shù)據(jù)源字段和目標(biāo)字段長(zhǎng)度或精度不符,需要特別注意看是否真的可以直接映射還是需要做一些簡(jiǎn)單運(yùn)算。
2、字段運(yùn)算,數(shù)據(jù)源的一個(gè)或多個(gè)字段進(jìn)行數(shù)學(xué)運(yùn)算得到的目標(biāo)字段,這種規(guī)則一般對(duì)數(shù)值型字段而言。
3、參照轉(zhuǎn)換,在轉(zhuǎn)換中通常要用數(shù)據(jù)源的一個(gè)或多個(gè)字段作為Key,去一個(gè)關(guān)聯(lián)數(shù)組中去搜索特定值,而且應(yīng)該只能得到唯一值。這個(gè)關(guān)聯(lián)數(shù)組使用Hash算法實(shí)現(xiàn)是比較合適也是最常見(jiàn)的,在整個(gè)ETL開(kāi)始之前,它就裝入內(nèi)存,對(duì)性能提高的幫助非常大。
4、字符串處理,從數(shù)據(jù)源某個(gè)字符串字段中經(jīng)常可以獲取特定信息,例如身份證號(hào)。而且,經(jīng)常會(huì)有數(shù)值型值以字符串形式體現(xiàn)。對(duì)字符串的操作通常有類型轉(zhuǎn)換、字符串截取等。但是由于字符類型字段的隨意性也造成了臟數(shù)據(jù)的隱患,所以在處理這種規(guī)則的時(shí)候,一定要加上異常處理。
5、空值判斷,對(duì)于空值的處理是數(shù)據(jù)倉(cāng)庫(kù)中一個(gè)常見(jiàn)問(wèn)題,是將它作為臟數(shù)據(jù)還是作為特定一種維成員?這恐怕還要看應(yīng)用的情況,也是需要進(jìn)一步探求的。但是無(wú)論怎樣,對(duì)于可能有NULL值的字段,不要采用“直接映射”的規(guī)則類型,必須對(duì)空值進(jìn)行判斷,目前我們的建議是將它轉(zhuǎn)換成特定的值。
6、日期轉(zhuǎn)換,在數(shù)據(jù)倉(cāng)庫(kù)中日期值一般都會(huì)有特定的,不同于日期類型值的表示方法,例如使用8位整型20040801表示日期。而在數(shù)據(jù)源中,這種字段基本都是日期類型的,所以對(duì)于這樣的規(guī)則,需要一些共通函數(shù)來(lái)處理將日期轉(zhuǎn)換為8位日期值、6位月份值等。
7、日期運(yùn)算,基于日期,我們通常會(huì)計(jì)算日差、月差、時(shí)長(zhǎng)等。一般數(shù)據(jù)庫(kù)提供的日期運(yùn)算函數(shù)都是基于日期型的,而在數(shù)據(jù)倉(cāng)庫(kù)中采用特定類型來(lái)表示日期的話,必須有一套自己的日期運(yùn)算函數(shù)集。
8、聚集運(yùn)算,對(duì)于事實(shí)表中的度量字段,他們通常是通過(guò)數(shù)據(jù)源一個(gè)或多個(gè)字段運(yùn)用聚集函數(shù)得來(lái)的,這些聚集函數(shù)為SQL標(biāo)準(zhǔn)中,包括sum,count,avg,min,max。
9、既定取值,這種規(guī)則和以上各種類型規(guī)則的差別就在于它不依賴于數(shù)據(jù)源字段,對(duì)目標(biāo)字段取一個(gè)固定的或是依賴系統(tǒng)的值。
探求ETL本質(zhì)之四(數(shù)據(jù)質(zhì)量)
“不要絕對(duì)的數(shù)據(jù)準(zhǔn)確,但要知道為什么不準(zhǔn)確。”
這是我們?cè)跇?gòu)建BI系統(tǒng)是對(duì)數(shù)據(jù)準(zhǔn)確性的要求。確實(shí),對(duì)絕對(duì)的數(shù)據(jù)準(zhǔn)確誰(shuí)也沒(méi)有把握,不僅是系統(tǒng)集成商,包括客戶也是無(wú)法確定。準(zhǔn)確的東西需要一個(gè)標(biāo)準(zhǔn),但首先要保證這個(gè)標(biāo)準(zhǔn)是準(zhǔn)確的,至少現(xiàn)在還沒(méi)有這樣一個(gè)標(biāo)準(zhǔn)??蛻魰?huì)提出一個(gè)相對(duì)標(biāo)準(zhǔn),例如將你的OLAP數(shù)據(jù)結(jié)果和報(bào)表結(jié)果對(duì)比。雖然這是一種不太公平的比較,你也只好認(rèn)了吧。
首先在數(shù)據(jù)源那里,已經(jīng)很難保證數(shù)據(jù)質(zhì)量了,這一點(diǎn)也是事實(shí)。在這一層有哪些可能原因?qū)е聰?shù)據(jù)質(zhì)量問(wèn)題?可以分為下面幾類:
1、數(shù)據(jù)格式錯(cuò)誤,例如缺失數(shù)據(jù)、數(shù)據(jù)值超出范圍或是數(shù)據(jù)格式非法等。要知道對(duì)于同樣處理大數(shù)據(jù)量的數(shù)據(jù)源系統(tǒng),他們通常會(huì)舍棄一些數(shù)據(jù)庫(kù)自身的檢查機(jī)制,例如字段約束等。他們盡可能將數(shù)據(jù)檢查在入庫(kù)前保證,但是這一點(diǎn)是很難確保的。這類情況諸如身份證號(hào)碼、手機(jī)號(hào)、非日期類型的日期字段等。
2、數(shù)據(jù)一致性,同樣,數(shù)據(jù)源系統(tǒng)為了性能的考慮,會(huì)在一定程度上舍棄外鍵約束,這通常會(huì)導(dǎo)致數(shù)據(jù)不一致。例如在帳務(wù)表中會(huì)出現(xiàn)一個(gè)用戶表中沒(méi)有的用戶ID,在例如有些代碼在代碼表中找不到等。
3、業(yè)務(wù)邏輯的合理性,這一點(diǎn)很難說(shuō)對(duì)與錯(cuò)。通常,數(shù)據(jù)源系統(tǒng)的設(shè)計(jì)并不是非常嚴(yán)謹(jǐn),例如讓用戶開(kāi)戶日期晚于用戶銷戶日期都是有可能發(fā)生的,一個(gè)用戶表中存在多個(gè)用戶ID也是有可能發(fā)生的。對(duì)這種情況,有什么辦法嗎?
構(gòu)建一個(gè)BI系統(tǒng),要做到完全理解數(shù)據(jù)源系統(tǒng)根本就是不可能的。特別是數(shù)據(jù)源系統(tǒng)在交付后,有更多維護(hù)人員的即興發(fā)揮,那更是要花大量的時(shí)間去尋找原因。以前曾經(jīng)爭(zhēng)辯過(guò)設(shè)計(jì)人員對(duì)規(guī)則描述的問(wèn)題,有人提出要在ETL開(kāi)始之前務(wù)必將所有的規(guī)則弄得一清二楚。我并不同意這樣的意見(jiàn),倒是認(rèn)為在ETL過(guò)程要有處理這些質(zhì)量有問(wèn)題數(shù)據(jù)的保證。一定要正面這些臟數(shù)據(jù),是丟棄還是處理,無(wú)法逃避。如果沒(méi)有質(zhì)量保證,那么在這個(gè)過(guò)程中,錯(cuò)誤會(huì)逐漸放大,拋開(kāi)數(shù)據(jù)源質(zhì)量問(wèn)題,我們?cè)賮?lái)看看ETL過(guò)程中哪些因素對(duì)數(shù)據(jù)準(zhǔn)確性產(chǎn)生重大影響。
1、規(guī)則描述錯(cuò)誤。上面提到對(duì)設(shè)計(jì)人員對(duì)數(shù)據(jù)源系統(tǒng)理解的不充分,導(dǎo)致規(guī)則理解錯(cuò)誤,這是一方面。另一方面,是規(guī)則的描述,如果無(wú)二義性地描述規(guī)則也是要探求的一個(gè)課題。規(guī)則是依附于目標(biāo)字段的,在探求之三中,提到規(guī)則的分類。但是規(guī)則總不能總是用文字描述,必須有嚴(yán)格的數(shù)學(xué)表達(dá)方式。我甚至想過(guò),如果設(shè)計(jì)人員能夠使用某種規(guī)則語(yǔ)言來(lái)描述,那么我們的ETL單元就可以自動(dòng)生成、同步,省去很多手工操作了。
2、ETL開(kāi)發(fā)錯(cuò)誤。即時(shí)規(guī)則很明確,ETL開(kāi)發(fā)的過(guò)程中也會(huì)發(fā)生一些錯(cuò)誤,例如邏輯錯(cuò)誤、書寫錯(cuò)誤等。例如對(duì)于一個(gè)分段值,開(kāi)區(qū)間閉區(qū)間是需要指定的,但是常常開(kāi)發(fā)人員沒(méi)注意,一個(gè)大于等于號(hào)寫成大于號(hào)就導(dǎo)致數(shù)據(jù)錯(cuò)誤。
3、人為處理錯(cuò)誤。在整體ETL流程沒(méi)有完成之前,為了圖省事,通常會(huì)手工運(yùn)行ETL過(guò)程,這其中一個(gè)重大的問(wèn)題就是你不會(huì)按照正常流程去運(yùn)行了,而是按照自己的理解去運(yùn)行,發(fā)生的錯(cuò)誤可能是誤刪了數(shù)據(jù)、重復(fù)裝載數(shù)據(jù)等。
探求ETL本質(zhì)之五(質(zhì)量保證)
上回提到ETL數(shù)據(jù)質(zhì)量問(wèn)題,這是無(wú)法根治的,只能采取特定的手段去盡量避免,而且必須要定義出度量方法來(lái)衡量數(shù)據(jù)的質(zhì)量是好還是壞。對(duì)于數(shù)據(jù)源的質(zhì)量,客戶對(duì)此應(yīng)該更加關(guān)心,如果在這個(gè)源頭不能保證比較干凈的數(shù)據(jù),那么后面的分析功能的可信度也都成問(wèn)題。數(shù)據(jù)源系統(tǒng)也在不斷進(jìn)化過(guò)程中,客戶的操作也在逐漸規(guī)范中,BI系統(tǒng)也同樣如此。本文探討一下對(duì)數(shù)據(jù)源質(zhì)量和ETL處理質(zhì)量的應(yīng)對(duì)方法。
如何應(yīng)對(duì)數(shù)據(jù)源的質(zhì)量問(wèn)題?記得在onteldatastage列表中也討論過(guò)一個(gè)話題-”-1的處理",在數(shù)據(jù)倉(cāng)庫(kù)模型維表中,通常有一條-1記錄,表示“未知”,這個(gè)未知含義可廣了,任何可能出錯(cuò)的數(shù)據(jù),NULL數(shù)據(jù)甚至是規(guī)則沒(méi)有涵蓋到的數(shù)據(jù),都轉(zhuǎn)成-1。這是一種處理臟數(shù)據(jù)的方法,但這也是一種掩蓋事實(shí)的方法。就好像寫一個(gè)函數(shù)FileOpen(filename),返回一個(gè)錯(cuò)誤碼,當(dāng)然,你可以只返回一種錯(cuò)誤碼,如-1,但這是一種不好的設(shè)計(jì),對(duì)于調(diào)用者來(lái)說(shuō),他需要依據(jù)這個(gè)錯(cuò)誤碼進(jìn)行某些判斷,例如是文件不存在,還是讀取權(quán)限不夠,都有相應(yīng)的處理邏輯。數(shù)據(jù)倉(cāng)庫(kù)中也是一樣,所以,建議將不同的數(shù)據(jù)質(zhì)量類型處理結(jié)果分別轉(zhuǎn)換成不同的值,譬如,在轉(zhuǎn)換后,-1表示參照不上,-2表示NULL數(shù)據(jù)等。不過(guò)這僅僅對(duì)付了上回提到的第一類錯(cuò)誤,數(shù)據(jù)格式錯(cuò)誤。對(duì)于數(shù)據(jù)一致性和業(yè)務(wù)邏輯合理性問(wèn)題,這仍有待探求。但這里有一個(gè)原則就是“必須在數(shù)據(jù)倉(cāng)庫(kù)中反應(yīng)數(shù)據(jù)源的質(zhì)量”。
對(duì)于ETL過(guò)程中產(chǎn)生的質(zhì)量問(wèn)題,必須有保障手段。從以往的經(jīng)驗(yàn)看,沒(méi)有保障手段給實(shí)施人員帶來(lái)麻煩重重。實(shí)施人員對(duì)于反復(fù)裝載數(shù)據(jù)一定不會(huì)陌生,甚至是最后數(shù)據(jù)留到最后的Cube,才發(fā)現(xiàn)了第一步ETL其實(shí)已經(jīng)錯(cuò)了。這個(gè)保障手段就是數(shù)據(jù)驗(yàn)證機(jī)制,當(dāng)然,它的目的是能夠在ETL過(guò)程中監(jiān)控?cái)?shù)據(jù)質(zhì)量,產(chǎn)生報(bào)警。這個(gè)模塊要將實(shí)施人員當(dāng)作是最終用戶,可以說(shuō)他們是數(shù)據(jù)驗(yàn)證機(jī)制的直接收益者。首先,必須有一個(gè)對(duì)質(zhì)量的度量方法,什么是高質(zhì)什么是低質(zhì),不能靠感官感覺(jué),但這卻是在沒(méi)有度量方法條件下通常的做法。那經(jīng)營(yíng)分析系統(tǒng)來(lái)說(shuō),聯(lián)通總部曾提出測(cè)試規(guī)范,這其實(shí)就是一種度量方法,例如指標(biāo)的誤差范圍不能高于5%等,對(duì)系統(tǒng)本身來(lái)說(shuō)其實(shí)必須要有這樣的度量方法,先不要說(shuō)這個(gè)度量方法是否科學(xué)。對(duì)于ETL數(shù)據(jù)處理質(zhì)量,他的度量方法應(yīng)該比聯(lián)通總部測(cè)試規(guī)范定義的方法更要嚴(yán)格,因?yàn)樗鄬I系統(tǒng)看作一個(gè)黑盒子,從數(shù)據(jù)源到展現(xiàn)的數(shù)據(jù)誤差允許一定的誤差。而ETL數(shù)據(jù)處理質(zhì)量度量是一種白盒的度量,要注重每一步過(guò)程。因此理論上,要求輸入輸出的指標(biāo)應(yīng)該完全一致。但是我們必須正面完全一致只是理想,對(duì)于有誤差的數(shù)據(jù),必須找到原因。
在質(zhì)量度量方法的前提下,就可以建立一個(gè)數(shù)據(jù)驗(yàn)證框架。此框架依據(jù)總量、分量數(shù)據(jù)稽核方法,該方法在高的《數(shù)據(jù)倉(cāng)庫(kù)中的數(shù)據(jù)稽核技術(shù)》一文中已經(jīng)指出。作為補(bǔ)充,下面提出幾點(diǎn)功能上的建議:
1、提供前端。將開(kāi)發(fā)實(shí)施人員當(dāng)作用戶,同樣也要為之提供友好的用戶界面。《稽核技術(shù)》一文中指出測(cè)試報(bào)告的形式,這種形式還是要依賴人為判斷,在一堆數(shù)據(jù)中去找規(guī)律。到不如用OLAP的方式提供界面,不光是加上測(cè)試統(tǒng)計(jì)出來(lái)的指標(biāo)結(jié)果,并且配合度量方法的計(jì)算。例如誤差率,對(duì)于誤差率為大于0的指標(biāo),就要好好查一下原因了。
2、提供框架。數(shù)據(jù)驗(yàn)證不是一次性工作,而是每次ETL過(guò)程中都必須做的。因此,必須有一個(gè)框架,自動(dòng)化驗(yàn)證過(guò)程,并提供擴(kuò)展手段,讓實(shí)施人員能夠增加驗(yàn)證范圍。有了這樣一個(gè)框架,其實(shí)它起到規(guī)范化操作的作用,開(kāi)發(fā)實(shí)施人員可以將主要精力放在驗(yàn)證腳本的編寫上,而不必過(guò)多關(guān)注驗(yàn)證如何融合到流程中,如何展現(xiàn)等工作。為此,要設(shè)計(jì)一套表,類似于DM表,每次驗(yàn)證結(jié)果數(shù)據(jù)都記錄其中,并且自動(dòng)觸發(fā)多維分析的數(shù)據(jù)裝載、發(fā)布等。這樣,實(shí)施人員可以在每次裝載,甚至在流程過(guò)程中就可以觀察數(shù)據(jù)的誤差率。特別是,如果數(shù)據(jù)倉(cāng)庫(kù)的模型能夠統(tǒng)一起來(lái),甚至數(shù)據(jù)驗(yàn)證腳本都可以確定下來(lái),剩下的就是規(guī)范流程了。
3、規(guī)范流程。上回提到有一種ETL數(shù)據(jù)質(zhì)量問(wèn)題是由于人工處理導(dǎo)致的,其中最主要原因還是流程不規(guī)范。開(kāi)發(fā)實(shí)施人員運(yùn)行單獨(dú)一個(gè)ETL單元是很方便的,雖然以前曾建議一個(gè)ETL單元必須是“可重入”的,這能夠解決誤刪數(shù)據(jù),重復(fù)裝載數(shù)據(jù)問(wèn)題。但要記住數(shù)據(jù)驗(yàn)證也是在流程當(dāng)中,要讓數(shù)據(jù)驗(yàn)證能夠日常運(yùn)作,就不要讓實(shí)施者感覺(jué)到他的存在??偟膩?lái)說(shuō),規(guī)范流程是提高實(shí)施效率的關(guān)鍵工作,這也是以后要繼續(xù)探求的。
探求ETL本質(zhì)之六(元數(shù)據(jù)漫談)
對(duì)于元數(shù)據(jù)(Metadata)的定義到目前為止沒(méi)有什么特別精彩的,這個(gè)概念非常廣,一般都是這樣定義,“元數(shù)據(jù)是描述數(shù)據(jù)的數(shù)據(jù)(Data about Data)”,這造成一種遞歸定義,就像問(wèn)小強(qiáng)住在哪里,答,在旺財(cái)隔壁。按照這樣的定義,元數(shù)據(jù)所描述的數(shù)據(jù)是什么呢?還是元數(shù)據(jù)。這樣就可能有元元元...元數(shù)據(jù)。我還聽(tīng)說(shuō)過(guò)一種對(duì)元數(shù)據(jù),如果說(shuō)數(shù)據(jù)是一抽屜檔案,那么元數(shù)據(jù)就是分類標(biāo)簽。那它和索引有什么區(qū)別? 元數(shù)據(jù)體現(xiàn)是一種抽象,哲學(xué)家從古至今都在抽象這個(gè)世界,力圖找到世界的本質(zhì)。抽象不是一層關(guān)系,它是一種逐步由具體到一般的過(guò)程。例如我->男人->人->哺乳動(dòng)物->生物這就是一個(gè)抽象過(guò)程,你要是在軟件業(yè)混會(huì)發(fā)現(xiàn)這個(gè)例子很常見(jiàn),面向?qū)ο蠓椒ň褪沁@樣一種抽象過(guò)程。它對(duì)世界中的事物、過(guò)程進(jìn)行抽象,使用面向?qū)ο蠓椒?,?gòu)建一套對(duì)象模型。同樣在面向?qū)ο蠓椒ㄖ?,類是?duì)象的抽象,接口又是對(duì)類的抽象。因此,我認(rèn)為可以將“元”和“抽象”換一下,叫抽象數(shù)據(jù)是不是好理解一些。
常聽(tīng)到這樣的話,“xx領(lǐng)導(dǎo)的講話高屋建瓴,給我們后面的工作指引的清晰的方向”,這個(gè)成語(yǔ)“高屋建瓴”,站在10樓往下到水,居高臨下,能砸死人,這是指站在一定的高度看待事物,這個(gè)一定的高度就是指他有夠“元”。在設(shè)計(jì)模式中,強(qiáng)調(diào)要對(duì)接口編程,就是說(shuō)你不要處理這類對(duì)象和那類對(duì)象的交互,而要處理這個(gè)接口和那個(gè)接口的交互,先別管他們內(nèi)部是怎么干的。元數(shù)據(jù)存在的意義也在于此,雖然上面說(shuō)了一通都撤到哲學(xué)上去,但這個(gè)詞必須還是要結(jié)合軟件設(shè)計(jì)中看,我不知道在別的領(lǐng)域是不是存在Metadata這樣的叫法,雖然我相信別的領(lǐng)域必然有類似的東東。元數(shù)據(jù)的存在就是要做到在更高抽象一層設(shè)計(jì)軟件。這肯定有好處,什么靈活性啊,擴(kuò)展性啊,可維護(hù)性啊,都能得到提高,而且架構(gòu)清晰,只是彎彎太多,要是從下往上看,太復(fù)雜了。很早以前,我曾看過(guò)backorifice的代碼,我靠,一個(gè)簡(jiǎn)單的功能,從這個(gè)類轉(zhuǎn)到父類,又轉(zhuǎn)到父類,很不理解,為什么一個(gè)簡(jiǎn)單的功能不在一個(gè)類的方法中實(shí)現(xiàn)就拉到了呢?現(xiàn)在想想,還真不能這樣,這雖然使代碼容易看懂了,但是結(jié)構(gòu)確實(shí)混亂的,那他只能干現(xiàn)在的事,如果有什么功能擴(kuò)展,這些代碼就廢了。
我從98年剛工作時(shí)就開(kāi)始接觸元數(shù)據(jù)的概念,當(dāng)時(shí)叫做元數(shù)據(jù)驅(qū)動(dòng)的系統(tǒng)架構(gòu),后來(lái)在QiDSS中也用到這個(gè)概念構(gòu)建QiNavigator,但是現(xiàn)在覺(jué)得元數(shù)據(jù)也沒(méi)啥,不就是建一堆表描述界面的元素,再利用這些數(shù)據(jù)自動(dòng)生成界面嗎。到了數(shù)據(jù)倉(cāng)庫(kù)系統(tǒng)中,這個(gè)概念更強(qiáng)了,是數(shù)據(jù)倉(cāng)庫(kù)中一個(gè)重要的部分。但是至今,我還是認(rèn)為這個(gè)概念過(guò)于玄乎,看不到實(shí)際的東西,市面上有一些元數(shù)據(jù)管理的東西,但是從應(yīng)用情況就得知,用的不多。之所以玄乎,就是因?yàn)槌橄髮哟螞](méi)有分清楚,關(guān)鍵就是對(duì)于元數(shù)據(jù)的分類(這種分類就是一種抽象過(guò)程)和元數(shù)據(jù)的使用。你可以將元數(shù)據(jù)抽象成0和1,但是那樣對(duì)你的業(yè)務(wù)有用嗎?必須還得抽象到適合的程度,最后問(wèn)題還是“度”。
數(shù)據(jù)倉(cāng)庫(kù)系統(tǒng)的元數(shù)據(jù)作用如何?還不就是使系統(tǒng)自動(dòng)運(yùn)轉(zhuǎn),易于管理嗎?要做到這一步,可沒(méi)必要將系統(tǒng)抽象到太極、兩儀、八卦之類的,業(yè)界也曾定義過(guò)一些元數(shù)據(jù)規(guī)范,向CWM、XMI等等,可以借鑒,不過(guò)俺對(duì)此也是不精通的說(shuō),以后再說(shuō)
第三篇:ETL學(xué)習(xí)心得
ETL學(xué)習(xí)心得:探求數(shù)據(jù)倉(cāng)庫(kù)關(guān)鍵環(huán)節(jié)ETL的本質(zhì)
做數(shù)據(jù)倉(cāng)庫(kù)系統(tǒng),ETL是關(guān)鍵的一環(huán)。說(shuō)大了,ETL是數(shù)據(jù)整合解決方案,說(shuō)小了,就是倒數(shù)據(jù)的工具。回憶一下工作這么些年來(lái),處理數(shù)據(jù)遷移、轉(zhuǎn)換的工作倒還真的不少。但是那些工作基本上是一次性工作或者很小數(shù)據(jù)量,使用access、DTS或是自己編個(gè)小程序搞定??墒窃跀?shù)據(jù)倉(cāng)庫(kù)系統(tǒng)中,ETL上升到了一定的理論高度,和原來(lái)小打小鬧的工具使用不同了。究竟什么不同,從名字上就可以看到,人家已經(jīng)將倒數(shù)據(jù)的過(guò)程分成3個(gè)步驟,E、T、L分別代表抽取、轉(zhuǎn)換和裝載。
其實(shí)ETL過(guò)程就是數(shù)據(jù)流動(dòng)的過(guò)程,從不同的數(shù)據(jù)源流向不同的目標(biāo)數(shù)據(jù)。但在數(shù)據(jù)倉(cāng)庫(kù)中,ETL有幾個(gè)特點(diǎn),一是數(shù)據(jù)同步,它不是一次性倒完數(shù)據(jù)就拉到,它是經(jīng)常性的活動(dòng),按照固定周期運(yùn)行的,甚至現(xiàn)在還有人提出了實(shí)時(shí)ETL的概念。二是數(shù)據(jù)量,一般都是巨大的,值得你將數(shù)據(jù)流動(dòng)的過(guò)程拆分成E、T和L。
現(xiàn)在有很多成熟的工具提供ETL功能,例如datastage、powermart等,且不說(shuō)他們的好壞。從應(yīng)用角度來(lái)說(shuō),ETL的過(guò)程其實(shí)不是非常復(fù)雜,這些工具給數(shù)據(jù)倉(cāng)庫(kù)工程帶來(lái)和很大的便利性,特別是開(kāi)發(fā)的便利和維護(hù)的便利。但另一方面,開(kāi)發(fā)人員容易迷失在這些工具中。舉個(gè)例子,VB是一種非常簡(jiǎn)單的語(yǔ)言并且也是非常易用的編程工具,上手特別快,但是真正VB的高手有多少?微軟設(shè)計(jì)的產(chǎn)品通常有個(gè)原則是“將使用者當(dāng)作傻瓜”,在這個(gè)原則下,微軟的東西確實(shí)非常好用,但是對(duì)于開(kāi)發(fā)者,如果你自己也將自己當(dāng)作傻瓜,那就真的傻了。ETL工具也是一樣,這些工具為我們提供圖形化界面,讓我們將主要的精力放在規(guī)則上,以期提高開(kāi)發(fā)效率。從使用效果來(lái)說(shuō),確實(shí)使用這些工具能夠非??焖俚貥?gòu)建一個(gè)job來(lái)處理某個(gè)數(shù)據(jù),不過(guò)從整體來(lái)看,并不見(jiàn)得他的整體效率會(huì)高多少。問(wèn)題主要不是出在工具上,而是在設(shè)計(jì)、開(kāi)發(fā)人員上。他們迷失在工具中,沒(méi)有去探求ETL的本質(zhì)。
可以說(shuō)這些工具應(yīng)用了這么長(zhǎng)時(shí)間,在這么多項(xiàng)目、環(huán)境中應(yīng)用,它必然有它成功之處,它必定體現(xiàn)了ETL的本質(zhì)。如果我們不透過(guò)表面這些工具的簡(jiǎn)單使用去看它背后蘊(yùn)涵的思想,最終我們作出來(lái)的東西也就是一個(gè)個(gè)獨(dú)立的job,將他們整合起來(lái)仍然有巨大的工作量。大家都知道“理論與實(shí)踐相結(jié)合”,如果在一個(gè)領(lǐng)域有所超越,必須要在理論水平上達(dá)到一定的高度
探求ETL本質(zhì)之一
ETL的過(guò)程就是數(shù)據(jù)流動(dòng)的過(guò)程,從不同異構(gòu)數(shù)據(jù)源流向統(tǒng)一的目標(biāo)數(shù)據(jù)。其間,數(shù)據(jù)的抽取、清洗、轉(zhuǎn)換和裝載形成串行或并行的過(guò)程。ETL的核心還是在于T這個(gè)過(guò)程,也就是轉(zhuǎn)換,而抽取和裝載一般可以作為轉(zhuǎn)換的輸入和輸出,或者,它們作為一個(gè)單獨(dú)的部件,其復(fù)雜度沒(méi)有轉(zhuǎn)換部件高。和OLTP系統(tǒng)中不同,那里充滿這單條記錄的insert、update和select等操作,ETL過(guò)程一般都是批量操作,例如它的裝載多采用批量裝載工具,一般都是DBMS系統(tǒng)自身附帶的工具,例如Oracle SQLLoader和DB2的autoloader等。
ETL本身有一些特點(diǎn),在一些工具中都有體現(xiàn),下面以datastage和powermart舉例來(lái)說(shuō)。
1、靜態(tài)的ETL單元和動(dòng)態(tài)的ETL單元實(shí)例;一次轉(zhuǎn)換指明了某種格式的數(shù)據(jù)如何格式化成另一種格式的數(shù)據(jù),對(duì)于數(shù)據(jù)源的物理形式在設(shè)計(jì)時(shí)可以不用指定,它可以在運(yùn)行時(shí),當(dāng)這個(gè)ETL單元?jiǎng)?chuàng)建一個(gè)實(shí)例時(shí)才指定。對(duì)于靜態(tài)和動(dòng)態(tài)的ETL單元,Datastage沒(méi)有嚴(yán)格區(qū)分,它的一個(gè)Job就是實(shí)現(xiàn)這個(gè)功能,在早期版本,一個(gè)Job同時(shí)不能運(yùn)行兩次,所以一個(gè)Job相當(dāng)于一個(gè)實(shí)例,在后期版本,它支持multiple instances,而且還不是默認(rèn)選項(xiàng)。Powermart中將這兩個(gè)概念加以區(qū)分,靜態(tài)的叫做Mapping,動(dòng)態(tài)運(yùn)行時(shí)叫做Session。
2、ETL元數(shù)據(jù);元數(shù)據(jù)是描述數(shù)據(jù)的數(shù)據(jù),他的含義非常廣泛,這里僅指ETL的元數(shù)據(jù)。主要包括每次轉(zhuǎn)換前后的數(shù)據(jù)結(jié)構(gòu)和轉(zhuǎn)換的規(guī)則。ETL元數(shù)據(jù)還包括形式參數(shù)的管理,形式參數(shù)的ETL單元定義的參數(shù),相對(duì)還有實(shí)參,它是運(yùn)行時(shí)指定的參數(shù),實(shí)參不在元數(shù)據(jù)管理范圍之內(nèi)。
3、數(shù)據(jù)流程的控制;要有可視化的流程編輯工具,提供流程定義和流程監(jiān)控功能。流程調(diào)度的最小單位是ETL單元實(shí)例,ETL單元是不能在細(xì)分的ETL過(guò)程,當(dāng)然這由開(kāi)發(fā)者來(lái)控制,例如可以將抽取、轉(zhuǎn)換放在一個(gè)ETL單元中,那樣這個(gè)抽取和轉(zhuǎn)換只能同時(shí)運(yùn)行,而如果將他們分作兩個(gè)單元,可
以分別運(yùn)行,這有利于錯(cuò)誤恢復(fù)操作。當(dāng)然,ETL單元究竟應(yīng)該細(xì)分到什么程度應(yīng)該依據(jù)具體應(yīng)用來(lái)看,目前還沒(méi)有找到很好的細(xì)分策略。比如,我們可以規(guī)定將裝載一個(gè)表的功能作為一個(gè)ETL單元,但是不可否認(rèn),這樣的ETL單元之間會(huì)有很多共同的操作,例如兩個(gè)單元共用一個(gè)Hash表,要將這個(gè)Hash表裝入內(nèi)存兩次。
4、轉(zhuǎn)換規(guī)則的定義方法;提供函數(shù)集提供常用規(guī)則方法,提供規(guī)則定義語(yǔ)言描述規(guī)則。
5、對(duì)數(shù)據(jù)的快速索引;一般都是利用Hash技術(shù),將參照關(guān)系表提前裝入內(nèi)存,在轉(zhuǎn)換時(shí)查找這個(gè)hash表。Datastage中有Hash文件技術(shù),Powermart也有類似的Lookup功能。
探求ETL本質(zhì)之二(分類)
昨在IT-Director上閱讀一篇報(bào)告,關(guān)于ETL產(chǎn)品分類的。一般來(lái)說(shuō),我們眼中的ETL工具都是價(jià)格昂貴,能夠處理海量數(shù)據(jù)的家伙,但是這是其中的一種。它可以分成4種,針對(duì)不同的需求,主要是從轉(zhuǎn)換規(guī)則的復(fù)雜度和數(shù)據(jù)量大小來(lái)看。它們包括
1、交互式運(yùn)行環(huán)境,你可以指定數(shù)據(jù)源、目標(biāo)數(shù)據(jù),指定規(guī)則,立馬ETL。這種交互式的操作無(wú)疑非常方便,但是只能適合小數(shù)據(jù)量和復(fù)雜度不高的ETL過(guò)程,因?yàn)橐坏┮?guī)則復(fù)雜了,可能需要語(yǔ)言級(jí)的描述,不能簡(jiǎn)簡(jiǎn)單單拖拖拽拽就可以的。還有數(shù)據(jù)量的問(wèn)題,這種交互式必然建立在解釋型語(yǔ)言基礎(chǔ)上,另外他的靈活性必然要犧牲一定的性能為代價(jià)。所以如果要處理海量數(shù)據(jù)的話,每次讀取一條記錄,每次對(duì)規(guī)則進(jìn)行解釋執(zhí)行,每次在寫入一條記錄,這對(duì)性能影響是非常大的。
2、專門編碼型的,它提供了一個(gè)基于某種語(yǔ)言的程序框架,你可以不必將編程精力放在一些周邊的功能上,例如讀文件功能、寫數(shù)據(jù)庫(kù)的功能,而將精力主要放在規(guī)則的實(shí)現(xiàn)上面。這種近似手工代碼的性能肯定是沒(méi)話說(shuō),除非你的編程技巧不過(guò)關(guān)(這也是不可忽視的因素之一)。對(duì)于處理大數(shù)據(jù)量,處理復(fù)雜轉(zhuǎn)換邏輯,這種方式的ETL實(shí)現(xiàn)是非常直觀的。
3、代碼生成器型的,它就像是一個(gè)ETL代碼生成器,提供簡(jiǎn)單的圖形化界面操作,讓你拖拖拽拽將轉(zhuǎn)換規(guī)則都設(shè)定好,其實(shí)他的后臺(tái)都是生成基于某種語(yǔ)言的程序,要運(yùn)行這個(gè)ETL過(guò)程,必須要編譯才行。Datastage就是類似這樣的產(chǎn)品,設(shè)計(jì)好的job必須要編譯,這避免了每次轉(zhuǎn)換的解釋執(zhí)行,但是不知道它生成的中間語(yǔ)言是什么。以前我設(shè)計(jì)的ETL工具大挪移其實(shí)也是歸屬于這一類,它提供了界面讓用戶編寫規(guī)則,最后生成C++語(yǔ)言,編譯后即可運(yùn)行。這類工具的特點(diǎn)就是要在界面上下狠功夫,必須讓用戶輕松定義一個(gè)ETL過(guò)程,提供豐富的插件來(lái)完成讀、寫和轉(zhuǎn)換函數(shù)。大挪移在這方面就太弱了,規(guī)則必須手寫,而且要寫成標(biāo)準(zhǔn)c++語(yǔ)法,這未免還是有點(diǎn)難為最終用戶了,還不如做成一個(gè)專業(yè)編碼型的產(chǎn)品呢。另外一點(diǎn),這類工具必須提供面向?qū)<覒?yīng)用的功能,因?yàn)樗豢赡芸紤]到所有的轉(zhuǎn)換規(guī)則和所有的讀寫,一方面提供插件接口來(lái)讓第三方編寫特定的插件,另一方面還有提供特定語(yǔ)言來(lái)實(shí)現(xiàn)高級(jí)功能。例如Datastage提供一種類Basic的語(yǔ)言,不過(guò)他的Job的腳本化實(shí)現(xiàn)好像就做的不太好,只能手工繪制job,而不能編程實(shí)現(xiàn)Job。
4、最后還有一種類型叫做數(shù)據(jù)集線器,顧名思義,他就是像Hub一樣地工作。將這種類型分出來(lái)和上面幾種分類在標(biāo)準(zhǔn)上有所差異,上面三種更多指ETL實(shí)現(xiàn)的方法,此類主要從數(shù)據(jù)處理角度。目前有一些產(chǎn)品屬于EAI(Enterprise Application Integration),它的數(shù)據(jù)集成主要是一種準(zhǔn)實(shí)時(shí)性。所以這類產(chǎn)品就像Hub一樣,不斷接收各種異構(gòu)數(shù)據(jù)源來(lái)的數(shù)據(jù),經(jīng)過(guò)處理,在實(shí)施發(fā)送到不同的目標(biāo)數(shù)據(jù)中去。
雖然,這些類看似各又千秋,特別在BI項(xiàng)目中,面對(duì)海量數(shù)據(jù)的ETL時(shí),中間兩種的選擇就開(kāi)始了,在選擇過(guò)程中,必須要考慮到開(kāi)發(fā)效率、維護(hù)方面、性能、學(xué)習(xí)曲線、人員技能等各方面因素,當(dāng)然還有最重要也是最現(xiàn)實(shí)的因素就是客戶的意象。
探求ETL本質(zhì)之三(轉(zhuǎn)換)
ETL探求之一中提到,ETL過(guò)程最復(fù)雜的部分就是T,這個(gè)轉(zhuǎn)換過(guò)程,T過(guò)程究竟有哪些類型呢?
一、宏觀輸入輸出
從對(duì)數(shù)據(jù)源的整個(gè)宏觀處理分,看看一個(gè)ETL過(guò)程的輸入輸出,可以分成下面幾類:
1、大小交,這種處理在數(shù)據(jù)清洗過(guò)程是常見(jiàn)了,例如從數(shù)據(jù)源到ODS階段,如果數(shù)據(jù)倉(cāng)庫(kù)采用
維度建模,而且維度基本采用代理鍵的話,必然存在代碼到此鍵值的轉(zhuǎn)換。如果用SQL實(shí)現(xiàn),必然需要將一個(gè)大表和一堆小表都Join起來(lái),當(dāng)然如果使用ETL工具的話,一般都是先將小表讀入內(nèi)存中再處理。這種情況,輸出數(shù)據(jù)的粒度和大表一樣。
2、大大交,大表和大表之間關(guān)聯(lián)也是一個(gè)重要的課題,當(dāng)然其中要有一個(gè)主表,在邏輯上,應(yīng)當(dāng)是主表Left Join輔表。大表之間的關(guān)聯(lián)存在最大的問(wèn)題就是性能和穩(wěn)定性,對(duì)于海量數(shù)據(jù)來(lái)說(shuō),必須有優(yōu)化的方法來(lái)處理他們的關(guān)聯(lián),另外,對(duì)于大數(shù)據(jù)的處理無(wú)疑會(huì)占用太多的系統(tǒng)資源,出錯(cuò)的幾率非常大,如何做到有效錯(cuò)誤恢復(fù)也是個(gè)問(wèn)題。對(duì)于這種情況,我們建議還是盡量將大表拆分成適度的稍小一點(diǎn)的表,形成大小交的類型。這類情況的輸出數(shù)據(jù)粒度和主表一樣。
3、站著進(jìn)來(lái),躺著出去。事務(wù)系統(tǒng)中為了提高系統(tǒng)靈活性和擴(kuò)展性,很多信息放在代碼表中維護(hù),所以它的“事實(shí)表”就是一種窄表,而在數(shù)據(jù)倉(cāng)庫(kù)中,通常要進(jìn)行寬化,從行變成列,所以稱這種處理情況叫做“站著進(jìn)來(lái),躺著出去”。大家對(duì)Decode肯定不陌生,這是進(jìn)行寬表化常見(jiàn)的手段之一。窄表變寬表的過(guò)程主要體現(xiàn)在對(duì)窄表中那個(gè)代碼字段的操作。這種情況,窄表是輸入,寬表是輸出,寬表的粒度必定要比窄表粗一些,就粗在那個(gè)代碼字段上。
4、聚集。數(shù)據(jù)倉(cāng)庫(kù)中重要的任務(wù)就是沉淀數(shù)據(jù),聚集是必不可少的操作,它是粗化數(shù)據(jù)粒度的過(guò)程。聚集本身其實(shí)很簡(jiǎn)單,就是類似SQL中Group by的操作,選取特定字段(維度),對(duì)度量字段再使用某種聚集函數(shù)。但是對(duì)于大數(shù)據(jù)量情況下,聚集算法的優(yōu)化仍是探究的一個(gè)課題。例如是直接使用SQL的Group by,還是先排序,在處理。
二、微觀規(guī)則
從數(shù)據(jù)的轉(zhuǎn)換的微觀細(xì)節(jié)分,可以分成下面的幾個(gè)基本類型,當(dāng)然還有一些復(fù)雜的組合情況,例如先運(yùn)算,在參照轉(zhuǎn)換的規(guī)則,這種基于基本類型組合的情況就不在此列了。ETL的規(guī)則是依賴目標(biāo)數(shù)據(jù)的,目標(biāo)數(shù)據(jù)有多少字段,就有多少條規(guī)則。
1、直接映射,原來(lái)是什么就是什么,原封不動(dòng)照搬過(guò)來(lái),對(duì)這樣的規(guī)則,如果數(shù)據(jù)源字段和目標(biāo)字段長(zhǎng)度或精度不符,需要特別注意看是否真的可以直接映射還是需要做一些簡(jiǎn)單運(yùn)算。
2、字段運(yùn)算,數(shù)據(jù)源的一個(gè)或多個(gè)字段進(jìn)行數(shù)學(xué)運(yùn)算得到的目標(biāo)字段,這種規(guī)則一般對(duì)數(shù)值型字段而言。
3、參照轉(zhuǎn)換,在轉(zhuǎn)換中通常要用數(shù)據(jù)源的一個(gè)或多個(gè)字段作為Key,去一個(gè)關(guān)聯(lián)數(shù)組中去搜索特定值,而且應(yīng)該只能得到唯一值。這個(gè)關(guān)聯(lián)數(shù)組使用Hash算法實(shí)現(xiàn)是比較合適也是最常見(jiàn)的,在整個(gè)ETL開(kāi)始之前,它就裝入內(nèi)存,對(duì)性能提高的幫助非常大。
4、字符串處理,從數(shù)據(jù)源某個(gè)字符串字段中經(jīng)??梢垣@取特定信息,例如身份證號(hào)。而且,經(jīng)常會(huì)有數(shù)值型值以字符串形式體現(xiàn)。對(duì)字符串的操作通常有類型轉(zhuǎn)換、字符串截取等。但是由于字符類型字段的隨意性也造成了臟數(shù)據(jù)的隱患,所以在處理這種規(guī)則的時(shí)候,一定要加上異常處理。
5、空值判斷,對(duì)于空值的處理是數(shù)據(jù)倉(cāng)庫(kù)中一個(gè)常見(jiàn)問(wèn)題,是將它作為臟數(shù)據(jù)還是作為特定一種維成員?這恐怕還要看應(yīng)用的情況,也是需要進(jìn)一步探求的。但是無(wú)論怎樣,對(duì)于可能有NULL值的字段,不要采用“直接映射”的規(guī)則類型,必須對(duì)空值進(jìn)行判斷,目前我們的建議是將它轉(zhuǎn)換成特定的值。
6、日期轉(zhuǎn)換,在數(shù)據(jù)倉(cāng)庫(kù)中日期值一般都會(huì)有特定的,不同于日期類型值的表示方法,例如使用8位整型20040801表示日期。而在數(shù)據(jù)源中,這種字段基本都是日期類型的,所以對(duì)于這樣的規(guī)則,需要一些共通函數(shù)來(lái)處理將日期轉(zhuǎn)換為8位日期值、6位月份值等。
7、日期運(yùn)算,基于日期,我們通常會(huì)計(jì)算日差、月差、時(shí)長(zhǎng)等。一般數(shù)據(jù)庫(kù)提供的日期運(yùn)算函數(shù)都是基于日期型的,而在數(shù)據(jù)倉(cāng)庫(kù)中采用特定類型來(lái)表示日期的話,必須有一套自己的日期運(yùn)算函數(shù)集。
8、聚集運(yùn)算,對(duì)于事實(shí)表中的度量字段,他們通常是通過(guò)數(shù)據(jù)源一個(gè)或多個(gè)字段運(yùn)用聚集函數(shù)得來(lái)的,這些聚集函數(shù)為SQL標(biāo)準(zhǔn)中,包括sum,count,avg,min,max。
9、既定取值,這種規(guī)則和以上各種類型規(guī)則的差別就在于它不依賴于數(shù)據(jù)源字段,對(duì)目標(biāo)字段取一個(gè)固定的或是依賴系統(tǒng)的值。
探求ETL本質(zhì)之四(數(shù)據(jù)質(zhì)量)
“不要絕對(duì)的數(shù)據(jù)準(zhǔn)確,但要知道為什么不準(zhǔn)確。”
這是我們?cè)跇?gòu)建BI系統(tǒng)是對(duì)數(shù)據(jù)準(zhǔn)確性的要求。確實(shí),對(duì)絕對(duì)的數(shù)據(jù)準(zhǔn)確誰(shuí)也沒(méi)有把握,不僅是系統(tǒng)集成商,包括客戶也是無(wú)法確定。準(zhǔn)確的東西需要一個(gè)標(biāo)準(zhǔn),但首先要保證這個(gè)標(biāo)準(zhǔn)是準(zhǔn)確的,至少現(xiàn)在還沒(méi)有這樣一個(gè)標(biāo)準(zhǔn)??蛻魰?huì)提出一個(gè)相對(duì)標(biāo)準(zhǔn),例如將你的OLAP數(shù)據(jù)結(jié)果和報(bào)表結(jié)果對(duì)比。雖然這是一種不太公平的比較,你也只好認(rèn)了吧。
首先在數(shù)據(jù)源那里,已經(jīng)很難保證數(shù)據(jù)質(zhì)量了,這一點(diǎn)也是事實(shí)。在這一層有哪些可能原因?qū)е聰?shù)據(jù)質(zhì)量問(wèn)題?可以分為下面幾類:
1、數(shù)據(jù)格式錯(cuò)誤,例如缺失數(shù)據(jù)、數(shù)據(jù)值超出范圍或是數(shù)據(jù)格式非法等。要知道對(duì)于同樣處理大數(shù)據(jù)量的數(shù)據(jù)源系統(tǒng),他們通常會(huì)舍棄一些數(shù)據(jù)庫(kù)自身的檢查機(jī)制,例如字段約束等。他們盡可能將數(shù)據(jù)檢查在入庫(kù)前保證,但是這一點(diǎn)是很難確保的。這類情況諸如身份證號(hào)碼、手機(jī)號(hào)、非日期類型的日期字段等。
2、數(shù)據(jù)一致性,同樣,數(shù)據(jù)源系統(tǒng)為了性能的考慮,會(huì)在一定程度上舍棄外鍵約束,這通常會(huì)導(dǎo)致數(shù)據(jù)不一致。例如在帳務(wù)表中會(huì)出現(xiàn)一個(gè)用戶表中沒(méi)有的用戶ID,在例如有些代碼在代碼表中找不到等。
3、業(yè)務(wù)邏輯的合理性,這一點(diǎn)很難說(shuō)對(duì)與錯(cuò)。通常,數(shù)據(jù)源系統(tǒng)的設(shè)計(jì)并不是非常嚴(yán)謹(jǐn),例如讓用戶開(kāi)戶日期晚于用戶銷戶日期都是有可能發(fā)生的,一個(gè)用戶表中存在多個(gè)用戶ID也是有可能發(fā)生的。對(duì)這種情況,有什么辦法嗎?
構(gòu)建一個(gè)BI系統(tǒng),要做到完全理解數(shù)據(jù)源系統(tǒng)根本就是不可能的。特別是數(shù)據(jù)源系統(tǒng)在交付后,有更多維護(hù)人員的即興發(fā)揮,那更是要花大量的時(shí)間去尋找原因。以前曾經(jīng)爭(zhēng)辯過(guò)設(shè)計(jì)人員對(duì)規(guī)則描述的問(wèn)題,有人提出要在ETL開(kāi)始之前務(wù)必將所有的規(guī)則弄得一清二楚。我并不同意這樣的意見(jiàn),倒是認(rèn)為在ETL過(guò)程要有處理這些質(zhì)量有問(wèn)題數(shù)據(jù)的保證。一定要正面這些臟數(shù)據(jù),是丟棄還是處理,無(wú)法逃避。如果沒(méi)有質(zhì)量保證,那么在這個(gè)過(guò)程中,錯(cuò)誤會(huì)逐漸放大,拋開(kāi)數(shù)據(jù)源質(zhì)量問(wèn)題,我們?cè)賮?lái)看看ETL過(guò)程中哪些因素對(duì)數(shù)據(jù)準(zhǔn)確性產(chǎn)生重大影響。
1、規(guī)則描述錯(cuò)誤。上面提到對(duì)設(shè)計(jì)人員對(duì)數(shù)據(jù)源系統(tǒng)理解的不充分,導(dǎo)致規(guī)則理解錯(cuò)誤,這是一方面。另一方面,是規(guī)則的描述,如果無(wú)二義性地描述規(guī)則也是要探求的一個(gè)課題。規(guī)則是依附于目標(biāo)字段的,在探求之三中,提到規(guī)則的分類。但是規(guī)則總不能總是用文字描述,必須有嚴(yán)格的數(shù)學(xué)表達(dá)方式。我甚至想過(guò),如果設(shè)計(jì)人員能夠使用某種規(guī)則語(yǔ)言來(lái)描述,那么我們的ETL單元就可以自動(dòng)生成、同步,省去很多手工操作了。
2、ETL開(kāi)發(fā)錯(cuò)誤。即時(shí)規(guī)則很明確,ETL開(kāi)發(fā)的過(guò)程中也會(huì)發(fā)生一些錯(cuò)誤,例如邏輯錯(cuò)誤、書寫錯(cuò)誤等。例如對(duì)于一個(gè)分段值,開(kāi)區(qū)間閉區(qū)間是需要指定的,但是常常開(kāi)發(fā)人員沒(méi)注意,一個(gè)大于等于號(hào)寫成大于號(hào)就導(dǎo)致數(shù)據(jù)錯(cuò)誤。
3、人為處理錯(cuò)誤。在整體ETL流程沒(méi)有完成之前,為了圖省事,通常會(huì)手工運(yùn)行ETL過(guò)程,這其中一個(gè)重大的問(wèn)題就是你不會(huì)按照正常流程去運(yùn)行了,而是按照自己的理解去運(yùn)行,發(fā)生的錯(cuò)誤可能是誤刪了數(shù)據(jù)、重復(fù)裝載數(shù)據(jù)等。
探求ETL本質(zhì)之五(質(zhì)量保證)
上回提到ETL數(shù)據(jù)質(zhì)量問(wèn)題,這是無(wú)法根治的,只能采取特定的手段去盡量避免,而且必須要定義出度量方法來(lái)衡量數(shù)據(jù)的質(zhì)量是好還是壞。對(duì)于數(shù)據(jù)源的質(zhì)量,客戶對(duì)此應(yīng)該更加關(guān)心,如果在這個(gè)源頭不能保證比較干凈的數(shù)據(jù),那么后面的分析功能的可信度也都成問(wèn)題。數(shù)據(jù)源系統(tǒng)也在不斷進(jìn)化過(guò)程中,客戶的操作也在逐漸規(guī)范中,BI系統(tǒng)也同樣如此。本文探討一下對(duì)數(shù)據(jù)源質(zhì)量和ETL處理質(zhì)量的應(yīng)對(duì)方法。
如何應(yīng)對(duì)數(shù)據(jù)源的質(zhì)量問(wèn)題?記得在onteldatastage列表中也討論過(guò)一個(gè)話題-“-1的處理”,在數(shù)據(jù)倉(cāng)庫(kù)模型維表中,通常有一條-1記錄,表示“未知”,這個(gè)未知含義可廣了,任何可能出錯(cuò)的數(shù)據(jù),NULL數(shù)據(jù)甚至是規(guī)則沒(méi)有涵蓋到的數(shù)據(jù),都轉(zhuǎn)成-1。這是一種處理臟數(shù)據(jù)的方法,但這也是一種掩蓋
事實(shí)的方法。就好像寫一個(gè)函數(shù)FileOpen(filename),返回一個(gè)錯(cuò)誤碼,當(dāng)然,你可以只返回一種錯(cuò)誤碼,如-1,但這是一種不好的設(shè)計(jì),對(duì)于調(diào)用者來(lái)說(shuō),他需要依據(jù)這個(gè)錯(cuò)誤碼進(jìn)行某些判斷,例如是文件不存在,還是讀取權(quán)限不夠,都有相應(yīng)的處理邏輯。數(shù)據(jù)倉(cāng)庫(kù)中也是一樣,所以,建議將不同的數(shù)據(jù)質(zhì)量類型處理結(jié)果分別轉(zhuǎn)換成不同的值,譬如,在轉(zhuǎn)換后,-1表示參照不上,-2表示NULL數(shù)據(jù)等。不過(guò)這僅僅對(duì)付了上回提到的第一類錯(cuò)誤,數(shù)據(jù)格式錯(cuò)誤。對(duì)于數(shù)據(jù)一致性和業(yè)務(wù)邏輯合理性問(wèn)題,這仍有待探求。但這里有一個(gè)原則就是“必須在數(shù)據(jù)倉(cāng)庫(kù)中反應(yīng)數(shù)據(jù)源的質(zhì)量”。
對(duì)于ETL過(guò)程中產(chǎn)生的質(zhì)量問(wèn)題,必須有保障手段。從以往的經(jīng)驗(yàn)看,沒(méi)有保障手段給實(shí)施人員帶來(lái)麻煩重重。實(shí)施人員對(duì)于反復(fù)裝載數(shù)據(jù)一定不會(huì)陌生,甚至是最后數(shù)據(jù)留到最后的Cube,才發(fā)現(xiàn)了第一步ETL其實(shí)已經(jīng)錯(cuò)了。這個(gè)保障手段就是數(shù)據(jù)驗(yàn)證機(jī)制,當(dāng)然,它的目的是能夠在ETL過(guò)程中監(jiān)控?cái)?shù)據(jù)質(zhì)量,產(chǎn)生報(bào)警。這個(gè)模塊要將實(shí)施人員當(dāng)作是最終用戶,可以說(shuō)他們是數(shù)據(jù)驗(yàn)證機(jī)制的直接收益者。
首先,必須有一個(gè)對(duì)質(zhì)量的度量方法,什么是高質(zhì)什么是低質(zhì),不能靠感官感覺(jué),但這卻是在沒(méi)有度量方法條件下通常的做法。那經(jīng)營(yíng)分析系統(tǒng)來(lái)說(shuō),聯(lián)通總部曾提出測(cè)試規(guī)范,這其實(shí)就是一種度量方法,例如指標(biāo)的誤差范圍不能高于5%等,對(duì)系統(tǒng)本身來(lái)說(shuō)其實(shí)必須要有這樣的度量方法,先不要說(shuō)這個(gè)度量方法是否科學(xué)。對(duì)于ETL數(shù)據(jù)處理質(zhì)量,他的度量方法應(yīng)該比聯(lián)通總部測(cè)試規(guī)范定義的方法更要嚴(yán)格,因?yàn)樗鄬I系統(tǒng)看作一個(gè)黑盒子,從數(shù)據(jù)源到展現(xiàn)的數(shù)據(jù)誤差允許一定的誤差。而ETL數(shù)據(jù)處理質(zhì)量度量是一種白盒的度量,要注重每一步過(guò)程。因此理論上,要求輸入輸出的指標(biāo)應(yīng)該完全一致。但是我們必須正面完全一致只是理想,對(duì)于有誤差的數(shù)據(jù),必須找到原因。
在質(zhì)量度量方法的前提下,就可以建立一個(gè)數(shù)據(jù)驗(yàn)證框架。此框架依據(jù)總量、分量數(shù)據(jù)稽核方法,該方法在高的《數(shù)據(jù)倉(cāng)庫(kù)中的數(shù)據(jù)稽核技術(shù)》一文中已經(jīng)指出。作為補(bǔ)充,下面提出幾點(diǎn)功能上的建議:
1、提供前端。將開(kāi)發(fā)實(shí)施人員當(dāng)作用戶,同樣也要為之提供友好的用戶界面?!痘思夹g(shù)》一文中指出測(cè)試報(bào)告的形式,這種形式還是要依賴人為判斷,在一堆數(shù)據(jù)中去找規(guī)律。到不如用OLAP的方式提供界面,不光是加上測(cè)試統(tǒng)計(jì)出來(lái)的指標(biāo)結(jié)果,并且配合度量方法的計(jì)算。例如誤差率,對(duì)于誤差率為大于0的指標(biāo),就要好好查一下原因了。
2、提供框架。數(shù)據(jù)驗(yàn)證不是一次性工作,而是每次ETL過(guò)程中都必須做的。因此,必須有一個(gè)框架,自動(dòng)化驗(yàn)證過(guò)程,并提供擴(kuò)展手段,讓實(shí)施人員能夠增加驗(yàn)證范圍。有了這樣一個(gè)框架,其實(shí)它起到規(guī)范化操作的作用,開(kāi)發(fā)實(shí)施人員可以將主要精力放在驗(yàn)證腳本的編寫上,而不必過(guò)多關(guān)注驗(yàn)證如何融合到流程中,如何展現(xiàn)等工作。為此,要設(shè)計(jì)一套表,類似于DM表,每次驗(yàn)證結(jié)果數(shù)據(jù)都記錄其中,并且自動(dòng)觸發(fā)多維分析的數(shù)據(jù)裝載、發(fā)布等。這樣,實(shí)施人員可以在每次裝載,甚至在流程過(guò)程中就可以觀察數(shù)據(jù)的誤差率。特別是,如果數(shù)據(jù)倉(cāng)庫(kù)的模型能夠統(tǒng)一起來(lái),甚至數(shù)據(jù)驗(yàn)證腳本都可以確定下來(lái),剩下的就是規(guī)范流程了。
3、規(guī)范流程。上回提到有一種ETL數(shù)據(jù)質(zhì)量問(wèn)題是由于人工處理導(dǎo)致的,其中最主要原因還是流程不規(guī)范。開(kāi)發(fā)實(shí)施人員運(yùn)行單獨(dú)一個(gè)ETL單元是很方便的,雖然以前曾建議一個(gè)ETL單元必須是“可重入”的,這能夠解決誤刪數(shù)據(jù),重復(fù)裝載數(shù)據(jù)問(wèn)題。但要記住數(shù)據(jù)驗(yàn)證也是在流程當(dāng)中,要讓數(shù)據(jù)驗(yàn)證能夠日常運(yùn)作,就不要讓實(shí)施者感覺(jué)到他的存在??偟膩?lái)說(shuō),規(guī)范流程是提高實(shí)施效率的關(guān)鍵工作,這也是以后要繼續(xù)探求的。
第四篇: ETL技術(shù)和數(shù)據(jù)倉(cāng)庫(kù)建設(shè)的研究
畢業(yè)論文(設(shè)計(jì))開(kāi)題報(bào)告
論文題目: ETL技術(shù)和數(shù)據(jù)倉(cāng)庫(kù)建設(shè)的研究
一、開(kāi)題依據(jù)(研究目的、意義及國(guó)內(nèi)外研究概況,附主要參考文獻(xiàn)) 文獻(xiàn)描述中人們對(duì)大數(shù)據(jù)時(shí)代下的定義中比較通俗一點(diǎn)是指“描述和定義信息爆炸時(shí)代產(chǎn)生的海量大數(shù)據(jù)時(shí)代”,何為大數(shù)據(jù)?大數(shù)據(jù)是從各種各樣不同類型的數(shù)據(jù)中,快速獲得有價(jià)值信息的一種前沿技術(shù)。大數(shù)據(jù)是指通過(guò)對(duì)海量的,種類和來(lái)源復(fù)雜的數(shù)據(jù)進(jìn)行有效地捕捉,發(fā)現(xiàn)和挖掘分析,用經(jīng)濟(jì)的方法提取其數(shù)據(jù)價(jià)值的技術(shù)體系或者技術(shù)架構(gòu)。所以,從廣義上講,大數(shù)據(jù)不僅僅是指大數(shù)據(jù)所涉及的數(shù)據(jù),還包含對(duì)這些數(shù)據(jù)如何進(jìn)行處理,存儲(chǔ)和分析的理論,方法以及技術(shù)。 大數(shù)據(jù)在2000 年代初的數(shù)據(jù)熱潮期間出現(xiàn),軟件和硬件功能是消費(fèi)者產(chǎn)生大量信息,包括大量結(jié)構(gòu)化和非結(jié)構(gòu)化信息。在pc和移動(dòng)智能終端迅速普及的當(dāng)下社會(huì),包括搜索引擎,移動(dòng)設(shè)備和工業(yè)機(jī)械等新技術(shù)可提供持續(xù)增長(zhǎng)并可處理的數(shù)據(jù),每天都有數(shù)以億計(jì)的海量數(shù)據(jù)產(chǎn)生,隨著可收集數(shù)據(jù)量的幾何倍增長(zhǎng),顯而易見(jiàn),傳統(tǒng)數(shù)據(jù)技術(shù)(關(guān)系數(shù)據(jù)庫(kù))不適合與大量天文數(shù)據(jù)量的結(jié)構(gòu)和非機(jī)構(gòu)化數(shù)據(jù)一起使用。Apache軟件基金會(huì)啟動(dòng)了第一個(gè)大數(shù)據(jù)創(chuàng)新項(xiàng)目,最重要的貢獻(xiàn)來(lái)自于 谷歌,雅虎,ibm等。最常用的引擎是:ApacheHive / Hadoop 是復(fù)雜數(shù)據(jù)準(zhǔn)備和ETL的標(biāo)桿產(chǎn)品,使得海量的數(shù)據(jù)的存儲(chǔ)和基于數(shù)據(jù)的分析變得更加便捷。 參考文獻(xiàn): Ralph Kimball.數(shù)據(jù)倉(cāng)庫(kù)工具箱(第三版) 王雪迎.Kettle 構(gòu)建Hadoop ETL系統(tǒng)實(shí)踐 占小憶.科技創(chuàng)新導(dǎo)報(bào) |
二、主要研究?jī)?nèi)容(說(shuō)明研究課題的具體內(nèi)容及課題的新穎性,并明確重點(diǎn)解決的科學(xué)問(wèn)題及預(yù)期結(jié)果) 隨著行業(yè)數(shù)據(jù)量的爆炸性增長(zhǎng),由于數(shù)據(jù)量的大,復(fù)雜,快速變化的性質(zhì),傳統(tǒng)的oltp系統(tǒng),事務(wù)型數(shù)據(jù)庫(kù),如 mysql,oracle,sqlserver等已經(jīng)不適用于對(duì)海量多元化數(shù)據(jù)進(jìn)行統(tǒng)計(jì)分析挖掘,本文主要討論和總結(jié)處理大數(shù)據(jù)的方法和現(xiàn)狀,我們的目標(biāo)就是探討研究數(shù)據(jù)量大的情況如何有效處理數(shù)據(jù)(ETL)以及構(gòu)建存儲(chǔ)基礎(chǔ)數(shù)據(jù)模型(數(shù)據(jù)倉(cāng)庫(kù))便于數(shù)據(jù)能被更高效的使用挖掘分析。 “數(shù)據(jù)倉(cāng)庫(kù)”一詞最早是在1990年,由Bill Inmon先生提出的,其描述如下:“數(shù)據(jù)倉(cāng)庫(kù)是為支持企業(yè)決策而特別設(shè)計(jì)和建立的數(shù)據(jù)集合”。準(zhǔn)確來(lái)說(shuō),數(shù)據(jù)倉(cāng)庫(kù)是一個(gè)環(huán)境,而不是一件產(chǎn)品,提供用戶用于決策支持的當(dāng)前和歷史數(shù)據(jù),這些數(shù)據(jù)在傳統(tǒng)的操作型數(shù)據(jù)庫(kù)中很難或者不能得到。數(shù)據(jù)倉(cāng)庫(kù)技術(shù)是為了有效的把操作形數(shù)據(jù)集成到統(tǒng)一的環(huán)境中以提供決策數(shù)據(jù)訪問(wèn)的各種技術(shù)和模型的總稱。 打破數(shù)據(jù)孤島的情況,對(duì)來(lái)源復(fù)雜的各個(gè)不同的業(yè)務(wù)系統(tǒng)的不同數(shù)據(jù)進(jìn)行整合,建立一個(gè)大集合的數(shù)據(jù)倉(cāng)庫(kù),構(gòu)造正真意義傻姑娘的“客戶同意試圖”,讓數(shù)據(jù)開(kāi)發(fā)和數(shù)據(jù)分析人員能夠切實(shí)掌握全面信息。為決策提供完備的數(shù)據(jù)依據(jù)。 “ETL”概念: (1)數(shù)據(jù)抽?。‥xtract),常規(guī)的數(shù)據(jù)抽取策略有:1)同步實(shí)現(xiàn)抽??;2)異步實(shí)現(xiàn)抽取 (2)數(shù)據(jù)清洗和轉(zhuǎn)換(Transformation),數(shù)據(jù)轉(zhuǎn)換工作進(jìn)行的時(shí)機(jī)有:1)在抽取過(guò)程中進(jìn)行數(shù)據(jù)處理;2)使用異步加載,以文件的方式處理;3)在數(shù)據(jù)加載過(guò)程中進(jìn)行數(shù)據(jù)處理;4)進(jìn)入數(shù)據(jù)倉(cāng)庫(kù)以后再進(jìn)行處理 (3)數(shù)據(jù)裝載(Load),數(shù)據(jù)的追加策略類型有:1)直接追加;2)全部覆蓋;3)更新追加 預(yù)期結(jié)果:(1)選型部署一個(gè)ETL工具,完成數(shù)據(jù)的抽取,轉(zhuǎn)換和裝載,保證數(shù)據(jù)穩(wěn)定持續(xù),源源不斷得從源系統(tǒng)進(jìn)入數(shù)據(jù)倉(cāng)庫(kù) (2)數(shù)據(jù)倉(cāng)庫(kù)的設(shè)計(jì)和模型建設(shè),便于數(shù)據(jù)存儲(chǔ)已經(jīng)數(shù)據(jù)開(kāi)發(fā)及分析人員便捷查詢的分層模型構(gòu)建 |
三、研究方案(研究方法、研究工作的總體安排和進(jìn)度,理論分析、計(jì)算、實(shí)驗(yàn)方法和步驟及其可行性,可能遇到的問(wèn)題及解決辦法) 2021/1/14-2022/2/2 明確論文內(nèi)容,進(jìn)行相關(guān)論文資料的查找與翻譯。 2022/2/2-2022/2/14 撰寫開(kāi)題報(bào)告 2022/2/14-2022/3/1 ETL常用應(yīng)用研究 2022/3/1-2022/3/15 數(shù)據(jù)倉(cāng)庫(kù)構(gòu)建研究 2022/3/15-2022/4/1 撰寫論文 2022/4/1-2022/4/08 論文修改定稿 |
四、指導(dǎo)老師意見(jiàn) 指導(dǎo)教師簽名: 年 月 日 |
第五篇:教學(xué)管理數(shù)據(jù)倉(cāng)庫(kù)中ETL的實(shí)現(xiàn)
龍?jiān)雌诳W(wǎng) http://004km.cn 教學(xué)管理數(shù)據(jù)倉(cāng)庫(kù)中ETL的實(shí)現(xiàn)
作者:占小憶
來(lái)源:《科技創(chuàng)新導(dǎo)報(bào)》2011年第16期
摘 要:ETL 工具從異構(gòu)數(shù)據(jù)源抽取數(shù)據(jù),并將數(shù)據(jù)清洗,規(guī)范化后裝載到數(shù)據(jù)倉(cāng)庫(kù)。文章從前期的數(shù)據(jù)理解階段入手,分別討論了數(shù)據(jù)的抽取、清洗轉(zhuǎn)換、裝載等不同階段需要考慮的設(shè)計(jì)問(wèn)題及相應(yīng)的解決方案。提出了以數(shù)據(jù)理解為根基,以清洗轉(zhuǎn)換為中心的設(shè)計(jì)思想,并給出成績(jī)管理模塊的具體實(shí)施步驟。
關(guān)鍵詞:ETL數(shù)據(jù)倉(cāng)庫(kù)數(shù)據(jù)抽取數(shù)據(jù)轉(zhuǎn)換數(shù)據(jù)加載
中圖分類號(hào):TP311.13 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1674-098X(2011)06(a)-0017-02 1 ETL的具體實(shí)現(xiàn)
ETL具有以下兩個(gè)主要特點(diǎn):①數(shù)據(jù)同步;②數(shù)據(jù)的成批操作。數(shù)據(jù)倉(cāng)庫(kù)中的數(shù)據(jù)來(lái)源于教師、學(xué)生資料、學(xué)生考試成績(jī)等等,其中一些數(shù)據(jù)存儲(chǔ)在SQLServer、Foxpro等數(shù)據(jù)庫(kù)中,還有一些以文本、word和excel方式存儲(chǔ)于文件中,這些數(shù)據(jù)是異構(gòu)數(shù)據(jù),需要進(jìn)一步處理后,才能加載到數(shù)據(jù)倉(cāng)庫(kù)中。本系統(tǒng)運(yùn)用SQL Server2000提供的DTS(數(shù)據(jù)轉(zhuǎn)換服務(wù))工具,實(shí)現(xiàn)從不同的數(shù)據(jù)源中轉(zhuǎn)換數(shù)據(jù)以創(chuàng)建數(shù)據(jù)倉(cāng)庫(kù)。1.1 數(shù)據(jù)抽取
源數(shù)據(jù)庫(kù)的所有細(xì)節(jié)數(shù)據(jù)對(duì)于數(shù)據(jù)倉(cāng)庫(kù)的主題域并不是都有用的,必須根據(jù)已確定主題的需要,從原有操作型數(shù)據(jù)庫(kù)中抽取相關(guān)數(shù)據(jù)到數(shù)據(jù)倉(cāng)庫(kù)。一般在設(shè)計(jì)數(shù)據(jù)抽取時(shí)要考慮以下幾個(gè)方面:源數(shù)據(jù)庫(kù)和目標(biāo)數(shù)據(jù)庫(kù)各自的數(shù)據(jù)庫(kù)格式是否一致?從源數(shù)據(jù)庫(kù)中要訪問(wèn)哪些文件和表?從源數(shù)據(jù)庫(kù)中可以提取哪些字段,抽取記錄的條件是什么?目標(biāo)數(shù)據(jù)庫(kù)中的表結(jié)構(gòu)是什么?應(yīng)當(dāng)按照什么時(shí)間間隔來(lái)重復(fù)抽取表,定期更新數(shù)據(jù)倉(cāng)庫(kù)等?大型數(shù)據(jù)抽取工作可有專門的數(shù)據(jù)處理工具來(lái)完成。如果有少量數(shù)據(jù)格式,也可有專業(yè)人員編寫抽取程序來(lái)完成數(shù)據(jù)抽取工作。
1.2 數(shù)據(jù)轉(zhuǎn)換
該數(shù)據(jù)倉(cāng)庫(kù)中的數(shù)據(jù)來(lái)自一個(gè)或多個(gè)異構(gòu)的數(shù)據(jù)庫(kù)系統(tǒng),這些數(shù)據(jù)源之間往往存在著不一致的問(wèn)題,如不一致的字段長(zhǎng)度、不一致的賦值等。數(shù)據(jù)不一致會(huì)嚴(yán)重影響數(shù)據(jù)倉(cāng)庫(kù)的數(shù)據(jù)質(zhì)量。數(shù)據(jù)轉(zhuǎn)換就是處理這些不一致性的過(guò)程。
(1)統(tǒng)一數(shù)據(jù)名稱及格式。由于不同數(shù)據(jù)源數(shù)據(jù)明明及定義沒(méi)有統(tǒng)一的標(biāo)準(zhǔn),因此在源數(shù)據(jù)載入數(shù)據(jù)倉(cāng)庫(kù)之前必須對(duì)各個(gè)數(shù)據(jù)源的數(shù)據(jù)名稱及格式進(jìn)行統(tǒng)一。要處理的內(nèi)容如下:大小寫字母和文本全部轉(zhuǎn)換為統(tǒng)一格式;從定點(diǎn)的十進(jìn)制數(shù)據(jù)到浮點(diǎn)式二進(jìn)制數(shù)據(jù)的格式數(shù)值數(shù)據(jù)均
龍?jiān)雌诳W(wǎng) http://004km.cn 須轉(zhuǎn)換為一致類型;統(tǒng)一書寫格式。如常見(jiàn)的日期格式(DD/MM/YY,MM/DD/YY,YY/MM/DD等)必須被轉(zhuǎn)換為同樣的形式。
(2)創(chuàng)建新的數(shù)據(jù)邏輯視圖。數(shù)據(jù)倉(cāng)庫(kù)中存在著源數(shù)據(jù)庫(kù)可能不存在的數(shù)據(jù),比如學(xué)生成績(jī)的平均分,通過(guò)人數(shù)等,因此還需要進(jìn)行一下轉(zhuǎn)換:把一個(gè)字段的各個(gè)部分隔成兩個(gè)或多個(gè)字段;把一個(gè)記錄的兩個(gè)或多個(gè)字段組合成一個(gè)字段;把來(lái)自多個(gè)記錄的字段結(jié)合成一個(gè)記錄;增加一個(gè)新字段用來(lái)存儲(chǔ)匯總記錄;為了多維分析的方便,在導(dǎo)入數(shù)據(jù)時(shí)也常通過(guò)Case語(yǔ)句和Convert函數(shù)來(lái)進(jìn)行簡(jiǎn)單的數(shù)據(jù)轉(zhuǎn)換。其他設(shè)計(jì)復(fù)雜的轉(zhuǎn)換需要單獨(dú)編寫轉(zhuǎn)換函數(shù)來(lái)實(shí)現(xiàn)。1.3 數(shù)據(jù)清洗
數(shù)據(jù)清洗的任務(wù)實(shí)際上就是過(guò)濾不符合要求的數(shù)據(jù),將過(guò)濾的結(jié)果交給業(yè)務(wù)主管部門,由業(yè)務(wù)單位確認(rèn)應(yīng)該過(guò)濾掉或是修正之后再進(jìn)行抽取。不符合要求的數(shù)據(jù)主要是有以下幾種:數(shù)據(jù)源中丟失數(shù)據(jù)、數(shù)據(jù)源中有錯(cuò)誤數(shù)據(jù)、兩個(gè)或多個(gè)數(shù)據(jù)源中的數(shù)據(jù)不一致或發(fā)生沖突。(1)對(duì)于數(shù)據(jù)的遺漏值和不規(guī)范值的處理,例如如生源地區(qū),學(xué)生在網(wǎng)上自主錄入的字段,有些學(xué)生不遵守錄入規(guī)則,導(dǎo)致該字段出現(xiàn)空值和不規(guī)則值。對(duì)于這一類數(shù)據(jù),可以利用系統(tǒng)的數(shù)據(jù)篩選功能將空值和不規(guī)則的值篩選出來(lái)加以手工修正。
(2)對(duì)于數(shù)據(jù)雜質(zhì)和不一致的數(shù)據(jù)應(yīng)視情況區(qū)別對(duì)待,不能一律刪除。例如學(xué)期成績(jī),應(yīng)當(dāng)查詢?cè)撋?dāng)前學(xué)期每門課程的成績(jī),從而來(lái)計(jì)算學(xué)期平均成績(jī),如果該生當(dāng)前學(xué)期有部分課程成績(jī)?yōu)榭?則認(rèn)定該生缺考以零值計(jì)算這些課程;如果全部課程成績(jī)都為空的話,則認(rèn)定該學(xué)生學(xué)業(yè)發(fā)生變更,直接刪除這些數(shù)據(jù)。
(3)實(shí)現(xiàn)數(shù)據(jù)一致性,如:匯總后的學(xué)生信息表和學(xué)生成績(jī)表中學(xué)生人數(shù)不同,即一張表中的學(xué)生記錄在另一張表中沒(méi)有對(duì)應(yīng)學(xué)生的數(shù)據(jù),這將對(duì)日后的數(shù)據(jù)分析產(chǎn)生相當(dāng)大的影響。為了兩張表所描述的學(xué)生統(tǒng)一起來(lái),查詢并刪除這些記錄。1.4 數(shù)據(jù)匯總
源數(shù)據(jù)庫(kù)中的細(xì)節(jié)數(shù)據(jù)進(jìn)入數(shù)據(jù)倉(cāng)庫(kù)后,還需要將這些數(shù)據(jù)在各種層次結(jié)構(gòu)上進(jìn)行匯總。例如,教學(xué)管理數(shù)據(jù)倉(cāng)庫(kù)中存儲(chǔ)的細(xì)節(jié)數(shù)據(jù)時(shí)每個(gè)學(xué)生每門課考試的考試成績(jī),由于時(shí)間維為學(xué)期、學(xué)年兩個(gè)層次。教師要對(duì)大面積的基礎(chǔ)課的學(xué)生成績(jī)作趨勢(shì)分析時(shí),可能要獲取每門基礎(chǔ)課程的每學(xué)期、每學(xué)年的各個(gè)年級(jí),各個(gè)學(xué)生的成績(jī)值時(shí),就必須分別在時(shí)間維的學(xué)期、學(xué)年這兩個(gè)層次結(jié)構(gòu)上對(duì)細(xì)節(jié)數(shù)據(jù)進(jìn)行匯總。為了提高數(shù)據(jù)倉(cāng)庫(kù)的查詢效率,我們往往要將這些匯總數(shù)據(jù)存儲(chǔ)到數(shù)據(jù)倉(cāng)庫(kù)中。根據(jù)匯總級(jí)別不同可分為輕度匯總數(shù)據(jù)和高度匯總數(shù)據(jù)。1.5 數(shù)據(jù)加載
數(shù)據(jù)加載就是將從源應(yīng)用系統(tǒng)中抽取、轉(zhuǎn)換后的數(shù)據(jù)加載到數(shù)據(jù)倉(cāng)庫(kù)系統(tǒng)中。教學(xué)管理數(shù)據(jù)倉(cāng)庫(kù)中,主要采用以下幾種方法加載數(shù)據(jù):(1)數(shù)據(jù)結(jié)構(gòu)相匹配的SQL Server關(guān)系表,用SQL
龍?jiān)雌诳W(wǎng) http://004km.cn insert語(yǔ)句加載;(2)存儲(chǔ)于異構(gòu)數(shù)據(jù)源的數(shù)據(jù),如FoxPro關(guān)系數(shù)據(jù)庫(kù),excel文件等,可以通過(guò)SQL Server的DTS來(lái)實(shí)現(xiàn)加載。(3)對(duì)需要調(diào)整的數(shù)據(jù),經(jīng)程序重整后轉(zhuǎn)變?yōu)楣潭ǜ袷降奈谋疚募?再導(dǎo)入數(shù)據(jù)倉(cāng)庫(kù)。(4)對(duì)少量的數(shù)據(jù),利用手工錄入。
分析數(shù)據(jù)裝載進(jìn)數(shù)據(jù)倉(cāng)庫(kù)中以后,還需要驗(yàn)證事實(shí)表與相關(guān)維表的引用完整性,確保所有事實(shí)表中的記錄都與維表中的適當(dāng)記錄相關(guān)。但維表中的每條記錄不一定要與事實(shí)表中的數(shù)據(jù)相關(guān)。
ETL工具選擇原則
目前已有眾多廠商推出數(shù)據(jù)倉(cāng)庫(kù)產(chǎn)品。IBM、Sybase、Oracle、CA、SAS、NCR、Microsoft等公司已相繼推出了自己的數(shù)據(jù)倉(cāng)庫(kù)解決方案,它們的ETL工具也都各有其優(yōu)勢(shì)和不足。在選擇ETL工具時(shí)我們必須遵守以下原則:可以支持多種平臺(tái),支持多種數(shù)據(jù)庫(kù);可以支持多種數(shù)據(jù)源,如 DBMS、電子表格、平面文件;具有規(guī)范的數(shù)據(jù)訪問(wèn)接口;工具生成的代碼必須是在開(kāi)發(fā)環(huán)境中可維護(hù)的;具有靈活的可編程性和調(diào)用外部程序的功能;能只抽取滿足指定條件的數(shù)據(jù)和源數(shù)據(jù)的指定部分;具有直觀的視圖、靈活的配置,能自動(dòng)調(diào)用以定期實(shí)現(xiàn)管理工作;能在抽取過(guò)程中進(jìn)行數(shù)據(jù)類型轉(zhuǎn)換和字符集轉(zhuǎn)換并能計(jì)算生成衍生的字段。3 教學(xué)管理系統(tǒng)中ETL的實(shí)現(xiàn)
本教學(xué)管理系統(tǒng)的主題主要有三個(gè)方面:學(xué)生成績(jī)管理、學(xué)生就業(yè)管理、教師科研管理。根據(jù)以上需求建立教學(xué)管理數(shù)據(jù)倉(cāng)庫(kù),在經(jīng)過(guò)總體需求分析后,建立了數(shù)據(jù)倉(cāng)庫(kù)的邏輯模型和物理模型,基本確定了數(shù)據(jù)倉(cāng)庫(kù)中事實(shí)表和維表的結(jié)構(gòu)。下面的工作就是將原 MIS系統(tǒng)中的相關(guān)數(shù)據(jù)轉(zhuǎn)移到數(shù)據(jù)倉(cāng)庫(kù)的事實(shí)表和維表中。主要包括:確定數(shù)據(jù)源、指定數(shù)據(jù)目的地以及操縱和轉(zhuǎn)換從數(shù)據(jù)源到數(shù)據(jù)目的地的數(shù)據(jù)?,F(xiàn)在各大廠商提出的數(shù)據(jù)倉(cāng)庫(kù)的解決方案中都提供了 ETL工具,在眾多產(chǎn)品中,一致認(rèn)為 DTS是系統(tǒng)最易使用、擴(kuò)展性最好、編程效率最高的數(shù)據(jù)抽取工具。
(1)DTS可以自動(dòng)或交互地從多個(gè)異構(gòu)數(shù)據(jù)源向數(shù)據(jù)倉(cāng)庫(kù)裝入數(shù)據(jù);(2)DTS支持快速的非記錄的塊拷貝程序向 SQL Server數(shù)據(jù)庫(kù)插入數(shù)據(jù)。這是目前為止將大量的數(shù)據(jù)移動(dòng)到SQL Server表中最快的方法;(3)DTS基于OLE DB接口能夠在關(guān)系數(shù)據(jù)源、非關(guān)系數(shù)據(jù)源以及ODBC數(shù)據(jù)源之間進(jìn)行轉(zhuǎn)移數(shù)據(jù);(4)DTS支持使用VBScript或 JavaScript等腳本語(yǔ)言創(chuàng)建自定義的轉(zhuǎn)換腳本。也允許使用編程語(yǔ)言(如Visual Basic或Visual C++)編寫自定義的組件,能夠在轉(zhuǎn)換中對(duì)數(shù)據(jù)進(jìn)行各種操作;(5)DTS同SQL Server 2000結(jié)合緊密,可以自動(dòng)調(diào)度導(dǎo)入或操作任務(wù),也可以使用SQL代理服務(wù)來(lái)進(jìn)行調(diào)度。
因此在本系統(tǒng)中選用 Microsoft的 DTS作為ET L工具。DTS主要的功能有導(dǎo)入和導(dǎo)出數(shù)據(jù)、變換數(shù)據(jù)和傳送數(shù)據(jù)庫(kù)對(duì)象。
龍?jiān)雌诳W(wǎng) http://004km.cn DTS允許在一個(gè)過(guò)程中完成導(dǎo)入、導(dǎo)出和變換數(shù)據(jù)。這個(gè)過(guò)程的定義可以保存在包當(dāng)中。DTS包含三種類型對(duì)象:連接對(duì)象、任務(wù)對(duì)象和步驟對(duì)象。連接對(duì)象定義數(shù)據(jù)源的連接,即與轉(zhuǎn)換的源和目標(biāo)的連接;任務(wù)對(duì)象定義了包中的動(dòng)作,例如執(zhí)行 SQL語(yǔ)句、拷貝一個(gè)表的內(nèi)容或執(zhí)行一段腳本;步驟對(duì)象定義任務(wù)對(duì)象的執(zhí)行的順序。定義包有三種方式:使用 DTS設(shè)計(jì)器(DTS Designer)、DTS導(dǎo)入和導(dǎo)出向?qū)?、DTS編程接口。DTS設(shè)計(jì)器定義包。包可以三種方式保存:基于COM的文件、MS SQL Server的msdb數(shù)據(jù)庫(kù)、作為外部Visual Basic文件。在本系統(tǒng)中我們用SQL語(yǔ)言和VBScript腳本語(yǔ)言對(duì)加載過(guò)程進(jìn)行編程控制,以正確完成加載任務(wù)。對(duì)所定義的包保存在msdb數(shù)據(jù)庫(kù)中。DTS組件在定義數(shù)據(jù)源和目的連接以后,可以在兩者之間進(jìn)行數(shù)據(jù)轉(zhuǎn)換。這是數(shù)據(jù)轉(zhuǎn)移的主要階段。DTS既可以復(fù)制整個(gè)表和視圖,又可以復(fù)制特定SQL語(yǔ)句返回的數(shù)據(jù),還可以針對(duì)源和目的都是 SQL數(shù)據(jù)庫(kù)時(shí),復(fù)制所有數(shù)據(jù)庫(kù)對(duì)象和數(shù)據(jù)。對(duì)事實(shí)表的轉(zhuǎn)換任務(wù)如下:由于事實(shí)表的字段全部來(lái)自原管理系統(tǒng)中的成績(jī)表,只是字段名稱不同,所以用SQL查詢語(yǔ)句即可:select ts.學(xué)號(hào),ts.教師編號(hào)as教師號(hào),ts.課程編號(hào)as課程號(hào),ts.成績(jī),ts.考試時(shí)間 from教學(xué)成績(jī)表ts 查詢語(yǔ)句編寫完成并分析有效以后,需要對(duì)目標(biāo)數(shù)據(jù)庫(kù)的表進(jìn)行選擇,在目的選項(xiàng)卡中單擊“創(chuàng)建”按鈕,填入事實(shí)表名scores fact和新增字段“學(xué)期編號(hào)”即可完成后如圖1 最后是對(duì)應(yīng)字段的映射處理,在轉(zhuǎn)換選項(xiàng)卡中只要進(jìn)行字段一對(duì)一的復(fù)制即可(除學(xué)期編號(hào)字段外),如圖2。
由于“學(xué)期編號(hào)”字段在源成績(jī)表中只有考試時(shí)間,所以需要把考試時(shí)間按照一定的規(guī)則轉(zhuǎn)換成“學(xué)期編號(hào)”,在此選擇“VB Script Language”語(yǔ)言將源腳本替換為如下腳本。Function Main()if year(DTSSource(“考試時(shí)間”))=2006 and month(DTSSource(“考試時(shí)間”))>=9 then DTSDestination(“學(xué)期編號(hào)”)=“2006200701” end if if year(DTSSource(“考試時(shí)間”))=2007 and month(DTSSource(“考試時(shí)間”))DTSDestination(“學(xué)期編號(hào)”)=“2006200702” end if if year(DTSSource(“考試時(shí)間”))=2007 and month(DTSSource(“考試時(shí)間”))>=9 then DTSDestination(“學(xué)期編號(hào)”)=“2007200801” end if
龍?jiān)雌诳W(wǎng) http://004km.cn if year(DTSSource(“考試時(shí)間”))=2008 and month(DTSSource(“考試時(shí)間”))DTSDestination(“學(xué)期編號(hào)”)=“2007200802” end if if year(DTSSource(“考試時(shí)間”))=2008 and month(DTSSource(“考試時(shí)間”))>=9 then DTSDestination(“學(xué)期編號(hào)”)=“2008200901” end if if year(DTSSource(“考試時(shí)間”))=2009 and month(DTSSource(“考試時(shí)間”))DTSDestination(“學(xué)期編號(hào)”)=“2008200902” end if Main=DTSTransformStat_OK End Function 各維表的轉(zhuǎn)換過(guò)程與此類似,只是在進(jìn)行學(xué)期維表的轉(zhuǎn)換時(shí),由于學(xué)期維表中的“學(xué)年”“學(xué)期”字段都來(lái)自于原操作型數(shù)據(jù)庫(kù)成績(jī)表的“考試時(shí)間”字段,轉(zhuǎn)換方法同“學(xué)期編號(hào)”字段通過(guò)ActiveX腳本對(duì)數(shù)據(jù)進(jìn)行一些編程的轉(zhuǎn)換才能實(shí)現(xiàn),在此就不敘述了。
事實(shí)表和各個(gè)維表轉(zhuǎn)換好以后,執(zhí)行這個(gè)定義好的DTS轉(zhuǎn)換任務(wù),數(shù)據(jù)將會(huì)按照設(shè)定步驟和規(guī)則導(dǎo)入數(shù)據(jù)倉(cāng)庫(kù)維表和事實(shí)表中,從而完成了數(shù)據(jù)倉(cāng)庫(kù)的數(shù)據(jù)轉(zhuǎn)載任務(wù)。同時(shí)還可以設(shè)置DTS包,將原操作型數(shù)據(jù)庫(kù)中變動(dòng)數(shù)據(jù)定期自動(dòng)地更新到數(shù)據(jù)倉(cāng)庫(kù)中。4 結(jié)語(yǔ)
ETL是數(shù)據(jù)倉(cāng)庫(kù)開(kāi)發(fā)項(xiàng)目的關(guān)鍵部分,也是一個(gè)長(zhǎng)期的過(guò)程,同時(shí)這部分的工作直接關(guān)系數(shù)據(jù)倉(cāng)庫(kù)中數(shù)據(jù)的質(zhì)量,從而影響到?jīng)Q策分析的結(jié)果和質(zhì)量。在ETL過(guò)程中的每一步都會(huì)發(fā)現(xiàn)大量的問(wèn)題,有些可以直接解決,有些則需要回溯到前一個(gè)甚至幾個(gè)過(guò)程。通常情況下,每次對(duì) ETL過(guò)程的修改都需要重新運(yùn)行整個(gè)ETL過(guò)程并對(duì)結(jié)果進(jìn)行驗(yàn)證。這樣一來(lái),開(kāi)發(fā)整個(gè)ETL過(guò)程的所需的時(shí)間必然很長(zhǎng)。因此,只有認(rèn)真、仔細(xì)地設(shè)計(jì)ETL過(guò)程中的每一步,盡量使得 ETL過(guò)程每一步的運(yùn)行效率更高、結(jié)果更準(zhǔn)確同時(shí)更容易修改,才能有效保證整個(gè)項(xiàng)目的最終成功。
參考文獻(xiàn)
龍?jiān)雌诳W(wǎng) http://004km.cn [1] W.H.I nmon,Building the data bridge,the ten critical success fact ors ofbuilding a data warehouse.DataBase Pr ogramming&Design.1992(11):70~73.[2] W.H.I nmon等著,王志海等譯,數(shù)據(jù)倉(cāng)庫(kù)1第二版[M],北京:機(jī)械工業(yè)出版社, 20001.[3] 張寧、賈自艷、史忠植,“數(shù)據(jù)倉(cāng)庫(kù)中ET L技術(shù)的研究”[J],計(jì)算機(jī)工程與應(yīng)用,2002(24):213~216.[4] 沙笑笑,等.DTS工具在建立數(shù)據(jù)倉(cāng)庫(kù)過(guò)程中的應(yīng)用[J].科技創(chuàng)新導(dǎo)報(bào),2008,10:26.