余肖生,胡孫枝,王東娟,王緩緩
(三峽大學(xué)計(jì)算機(jī)與信息學(xué)院,湖北宜昌 443002)
企業(yè)數(shù)據(jù)倉庫主要提供戰(zhàn)略信息用于支持管理決策[1]。高質(zhì)量的數(shù)據(jù)可能是數(shù)據(jù)倉庫成功最重要的因素[2],而低質(zhì)量的數(shù)據(jù)可能對決策產(chǎn)生不利影響[3-4]。數(shù)據(jù)倉庫環(huán)境由3個相互獨(dú)立的組件組成,即數(shù)據(jù)預(yù)備域、數(shù)據(jù)處理域和數(shù)據(jù)存儲域。其中,數(shù)據(jù)預(yù)備域除了接收來自源應(yīng)用系統(tǒng)的操作數(shù)據(jù)外,還執(zhí)行很多潛在的轉(zhuǎn)換,例如糾正拼寫錯誤、解決域沖突、處理丟失的元素或解析成標(biāo)準(zhǔn)格式等[5]。除此之外,它必須保證數(shù)據(jù)的完整性。這不僅限于新數(shù)據(jù),也針對存儲在數(shù)據(jù)倉庫中的所有數(shù)據(jù)。輸出的數(shù)據(jù)將作為下一步處理的基礎(chǔ)。從某種意義上講,數(shù)據(jù)預(yù)備域輸出的數(shù)據(jù)質(zhì)量將直接決定著整個數(shù)據(jù)倉庫的質(zhì)量。本文首先討論數(shù)據(jù)倉庫的數(shù)據(jù)預(yù)備域和數(shù)據(jù)倉庫的數(shù)據(jù)質(zhì)量維度,在此基礎(chǔ)上,討論從操作源應(yīng)用系統(tǒng)來的數(shù)據(jù)可能存在的問題,最后針對這些問題,討論在數(shù)據(jù)預(yù)備域中如何進(jìn)行處理以得到高質(zhì)量的數(shù)據(jù)。
數(shù)據(jù)預(yù)備域是數(shù)據(jù)倉庫中關(guān)于數(shù)據(jù)處理的第一個域,如圖1所示[6]。在這個域,從源應(yīng)用系統(tǒng)中接收來的數(shù)據(jù)將被按數(shù)據(jù)質(zhì)量要求進(jìn)行預(yù)處理,以便后續(xù)數(shù)據(jù)的處理和分析可以順利進(jìn)行。
圖1 數(shù)據(jù)倉庫之?dāng)?shù)據(jù)預(yù)備域
在平面文件區(qū),先接收從源應(yīng)用系統(tǒng)傳送過來的平面文件。有時由于一些原因這些平面文件不可能直接置于操作平臺上,因此這些平面文件在該區(qū)還需要進(jìn)一步處理。在接收的平面文件上執(zhí)行的典型操作有解壓縮、驗(yàn)證、處理、壓縮、存檔等。
原始表區(qū)的管理通過DBMS而不是平面文件區(qū)的操作系統(tǒng)。這個區(qū)中的相關(guān)對象是數(shù)據(jù)庫表。
為了使收集、整合或轉(zhuǎn)換等接下來的處理更順利,在這個區(qū)中必須完成許多任務(wù)。其中,有些任務(wù)是復(fù)雜的,而另一些任務(wù)則面臨著大數(shù)據(jù)量。針對這種情況,應(yīng)盡可能地將平面文件區(qū)來的平面文件加載至原始表區(qū)的各自的表中,主要原因有:
1)表由已命名的行和已排序的數(shù)據(jù)列組成,而平面文件則包括多行字符,字符之間通過一些特殊字符分隔。因此,相比平面文件而言,表的內(nèi)容更容易閱讀和理解。這與數(shù)據(jù)調(diào)試特別相關(guān)。
2)相比操作系統(tǒng)提供的命令腳本語言,DBMS提供的數(shù)據(jù)操作語言(例如SQL),則更為簡單、強(qiáng)大。因此,基于表的程序開發(fā)比基于平面文件使用命令腳本語言更容易且更富有成效。
3)為了有效地處理大量數(shù)據(jù),一些復(fù)雜和巧妙的算法、數(shù)據(jù)結(jié)構(gòu)、方法等不可缺少。目前,所有這些通常在專業(yè)的DBMS中都已實(shí)現(xiàn)。另一方面,若沒有極大的努力,使用操作系統(tǒng)提供的命令腳本語言實(shí)現(xiàn)所有這些幾乎是不可能的。
在預(yù)備域中所有處理執(zhí)行的最終結(jié)果都將置于已預(yù)備表區(qū),由DBMS管理。這是整個預(yù)備域的終點(diǎn),也是隨后處理域的起點(diǎn)。
數(shù)據(jù)質(zhì)量是數(shù)據(jù)倉庫中分析結(jié)論正確性和有效性的基礎(chǔ),也是最重要的前提和保障。數(shù)據(jù)質(zhì)量維度是數(shù)據(jù)質(zhì)量的評價標(biāo)準(zhǔn)。為了保證數(shù)據(jù)預(yù)備域的平面文件區(qū)、原始表區(qū)的數(shù)據(jù)質(zhì)量,筆者建立了數(shù)據(jù)倉庫的數(shù)據(jù)質(zhì)量維度[7-9](如圖2所示),以此作為規(guī)范已預(yù)備表區(qū)中數(shù)據(jù)的基礎(chǔ)。
圖2 數(shù)據(jù)倉庫的數(shù)據(jù)質(zhì)量維度
完備性:數(shù)據(jù)的完備性確保提供的數(shù)據(jù)能滿足用戶的期望且數(shù)據(jù)是可用的。必須注意的是:盡管數(shù)據(jù)可能是不可用的,但如果數(shù)據(jù)能夠滿足用戶的期望,它仍然可被視為完備的。
相容性:為了使數(shù)據(jù)保持相容,整個企業(yè)中的數(shù)據(jù)應(yīng)彼此協(xié)調(diào),且與其他的數(shù)據(jù)集沒有任何沖突。
有效性:這里指數(shù)據(jù)的正確性和合理性。
一致性:數(shù)據(jù)一致性意味著在特定的格式下數(shù)據(jù)值是一致的。
準(zhǔn)確性:如果數(shù)據(jù)能正確反映現(xiàn)實(shí)世界的對象或一個被描述的事件,那么數(shù)據(jù)是準(zhǔn)確的。若產(chǎn)品、人名或地址被不正確地拼寫,這些數(shù)據(jù)遲早會影響操作和分析應(yīng)用。
完整性:數(shù)據(jù)的完整性是指數(shù)據(jù)的可信賴性。如果數(shù)據(jù)丟失重要的關(guān)系連接,不能把相關(guān)記錄連接在一起,那么它可能會在不同系統(tǒng)之間產(chǎn)生冗余。
唯一性:數(shù)據(jù)唯一性主要用來避免不必要的數(shù)據(jù)重復(fù)。
數(shù)據(jù)倉庫的數(shù)據(jù)質(zhì)量與數(shù)據(jù)庫的完整性約束存在著密切的關(guān)系。從圖2可以看出:數(shù)據(jù)庫的域完整性約束對數(shù)據(jù)倉庫的完備性、有效性、一致性和完整性等數(shù)據(jù)質(zhì)量維度有較明顯的影響;用戶自定義完整性約束與有效性和準(zhǔn)確性等數(shù)據(jù)質(zhì)量維度聯(lián)系緊密;參照完整性約束對相容性和完整性等數(shù)據(jù)質(zhì)量維度會產(chǎn)生很大的影響;實(shí)體完整性約束往往與相容性、完整性和唯一性等數(shù)據(jù)質(zhì)量維度有很大關(guān)聯(lián)。數(shù)據(jù)質(zhì)量維度與數(shù)據(jù)庫完整性約束之間的關(guān)系沒有明顯的界線,同一個完整性約束可能同時影響多個數(shù)據(jù)質(zhì)量維度,而同一個數(shù)據(jù)質(zhì)量維度也可能同時受多個完整性約束影響。
數(shù)據(jù)倉庫構(gòu)建的每個階段都存在數(shù)據(jù)質(zhì)量問題,而作為接收外部源應(yīng)用系統(tǒng)數(shù)據(jù)的數(shù)據(jù)預(yù)備域的數(shù)據(jù)質(zhì)量問題顯得尤為突出。數(shù)據(jù)質(zhì)量問題主要存在于以下幾個方面:
數(shù)據(jù)不完整是數(shù)據(jù)預(yù)備域中存在的主要問題之一,包括記錄的缺失、字段信息的缺失、記錄不完整等。數(shù)據(jù)中的值缺失、列缺失,源數(shù)據(jù)校驗(yàn)標(biāo)準(zhǔn)的缺乏以及未定義或不明確定義的參照完整性都是數(shù)據(jù)不完整的表現(xiàn)[8]。此外,未指明值域和數(shù)據(jù)類型也很大程度地影響了數(shù)據(jù)的完整性[10]。
數(shù)據(jù)不一致主要體現(xiàn)在系統(tǒng)之間或功能模塊之間的記錄不一致、編碼不一致、引用不一致等[8]。此外,數(shù)據(jù)類型不一致、數(shù)據(jù)描述不清晰、信息句法和數(shù)據(jù)語義不明確以至于無法捕捉真實(shí)值也會產(chǎn)生數(shù)據(jù)不一致[10-11]。
數(shù)據(jù)錯誤主要體現(xiàn)在數(shù)據(jù)類型錯誤、數(shù)據(jù)范圍越界、數(shù)據(jù)違反業(yè)務(wù)規(guī)則等[10]。另一方面,數(shù)據(jù)采集和數(shù)據(jù)運(yùn)算的錯誤也是導(dǎo)致數(shù)據(jù)錯誤的主要原因。
數(shù)據(jù)不準(zhǔn)確是導(dǎo)致數(shù)據(jù)質(zhì)量低下的原因之一,主要表現(xiàn)在數(shù)據(jù)源中使用了近似值或替代值,數(shù)據(jù)值不符合字段描述和商業(yè)規(guī)則等。
同一個數(shù)據(jù)源中可能由于沒有及時更新或者更新失敗致使數(shù)據(jù)失效,不同數(shù)據(jù)源依據(jù)各自的業(yè)務(wù)規(guī)則定義的數(shù)據(jù)時效各不相同。另外,某一業(yè)務(wù)系統(tǒng)中的數(shù)據(jù)更新沒有記錄或者沒有傳遞到其他的系統(tǒng)中也會使得數(shù)據(jù)失去時效,從而導(dǎo)致數(shù)據(jù)質(zhì)量問題[10]。
同一數(shù)據(jù)由于存在于多個數(shù)據(jù)源中,又缺乏統(tǒng)一建模而產(chǎn)生數(shù)據(jù)冗余。此外,對于數(shù)據(jù)倉庫而言,并非所有的源應(yīng)用系統(tǒng)傳遞來的數(shù)據(jù)行都是相關(guān)的[10]。
數(shù)據(jù)預(yù)備域采用錯誤拒絕、列清洗、行過濾等方法[6]來處理進(jìn)入數(shù)據(jù)倉庫中的數(shù)據(jù),保證進(jìn)入已預(yù)備表區(qū)的數(shù)據(jù)是“清潔”的。由于數(shù)據(jù)倉庫在構(gòu)建過程中不斷地有新數(shù)據(jù)載入,因此先要識別已有數(shù)據(jù)和新加載數(shù)據(jù)之間的變化量。
變化量是指與上次交付的數(shù)據(jù)相比,此次交付時的變化。變化量可定義如下:
兩個時間點(diǎn) t1,t2,t1<t2,數(shù)據(jù)集 DS在時間點(diǎn)t1,t2的差異就是數(shù)據(jù)集在t1,t2的變化量,即(DS_t2-DS_t1)∪(DS_t1-DS_t2)。
數(shù)據(jù)倉庫應(yīng)該有自己的機(jī)制來識別變化量,否則受到影響的源應(yīng)用系統(tǒng)只能周期性地交付完整的全部數(shù)據(jù)。
為了正確識別現(xiàn)在接收的與先前接收的全部數(shù)據(jù)之間的變化量,應(yīng)滿足以下條件:
1)先前的全部數(shù)據(jù)直接可用,并且存儲在數(shù)據(jù)預(yù)備域的一個表中。2)前后兩次交付的數(shù)據(jù)有完全相同的模式。假設(shè)目前的全部數(shù)據(jù)FS_new與先前的全部數(shù)據(jù)FS_old都滿足以上條件,則:
純插入(INSERT)部分:FS_new-FS_old,F(xiàn)S_new≠FS_old
純刪除(DELETE)部分:FS_old-FS_new,F(xiàn)S_new≠FS_old
修改插入(INSERT)部分:FS_new-FS_old,F(xiàn)S_new=FS_old
修改刪除(DELETE)部分:FS_old-FS_new,F(xiàn)S_new=FS_old
將這4個部分合并得到完整的變化量。
如果這些表定義明確且利用了合適的加載工具,加載過程中就能檢測出重復(fù)的行和重復(fù)的碼。事實(shí)上,在不同層次上,表已經(jīng)定義了許多約束來保證這個階段的數(shù)據(jù)質(zhì)量。不滿足約束的行將被拒絕且被寫入一些特定的數(shù)據(jù)錯誤表中。
根據(jù)數(shù)據(jù)倉庫的要求和標(biāo)準(zhǔn),如果不能保證從源應(yīng)用系統(tǒng)傳遞過來的數(shù)據(jù)都滿足數(shù)據(jù)倉庫的數(shù)據(jù)質(zhì)量維度,那么清洗數(shù)據(jù)就是數(shù)據(jù)預(yù)備域的任務(wù)之一。
為了清洗數(shù)據(jù),需要建立一個至少含有以下列的轉(zhuǎn)換表:
①源應(yīng)用系統(tǒng);
②數(shù)據(jù)類型;
③該數(shù)據(jù)類型的本機(jī)默認(rèn)值;
④在數(shù)據(jù)倉庫中該數(shù)據(jù)類型的相應(yīng)的標(biāo)準(zhǔn)默認(rèn)值。
在這個轉(zhuǎn)換表中的行意味著:如果討論中的列是來源于已給定的源應(yīng)用系統(tǒng),具有指定的數(shù)據(jù)類型,并有規(guī)定的本機(jī)默認(rèn)值,那么這個表中的行現(xiàn)在應(yīng)該包含數(shù)據(jù)倉庫中指定的標(biāo)準(zhǔn)值。
由于源應(yīng)用系統(tǒng)沒有安全的數(shù)據(jù)類型系統(tǒng),故應(yīng)該創(chuàng)建一個校正表,且至少包含以下一些列:
①源應(yīng)用系統(tǒng);
②源表;
③數(shù)據(jù)類型VARCHAR的源列;
④源列錯誤值的域;
⑤在校正的情況下,這個列正確的默認(rèn)值;
⑥當(dāng)檢測到一行包含不正確的值時,應(yīng)該誘發(fā)附加的指令。
這個校正表中的行意味著:如果從給定的源應(yīng)用系統(tǒng)來的源表列中,其中一個目標(biāo)列有錯誤值,那么提供的正確值將被用于數(shù)據(jù)倉庫。如果需要附加的指令,如將包含錯誤值的行寫進(jìn)錯誤表,那么指令將被執(zhí)行。
校正表將用以下附加列來擴(kuò)充:
①源列的格式,如:在VARCHAR中表示的日期“YYYYMMDD”或“YYYY-MM-DD”。
②數(shù)據(jù)倉庫中目標(biāo)列的數(shù)據(jù)類型,如:DATE或TIMESTAMP。
帶有這些附加列的行意味著:源列的值應(yīng)該按照指定的格式正常地轉(zhuǎn)換成給定數(shù)據(jù)類型的目標(biāo)列的值。按照定義,如果結(jié)果值是錯誤的,那么指定的正確值將被用于目標(biāo)列。
假設(shè)以上描述的轉(zhuǎn)換表和校正表是可利用的,則可按以下步驟進(jìn)行列清洗:
1)從數(shù)據(jù)庫目錄提取討論中的源表列,根據(jù)它們的序列號給它們排序;
2)如果轉(zhuǎn)換表、校正表是可用的,則合并轉(zhuǎn)換表或校正表或兩者中相應(yīng)的行;
3)對于包含在1個或2個表的每個列,根據(jù)表中提供的信息,相應(yīng)地構(gòu)建轉(zhuǎn)換表和/或校正表的片段;
4)構(gòu)造2個列列表:
①目標(biāo)列表:從數(shù)據(jù)庫目錄中取這些列。
②源列表:用與目標(biāo)列表相同的順序。如果這個列在步驟3)中已經(jīng)處理,那么取結(jié)果片段;否則,從數(shù)據(jù)庫目錄取它自身;
5)構(gòu)造一個語句:INSERT INTO〈目標(biāo)列表〉SELECT〈源列表〉FROM源表。
即使只考慮最后一次更新后的變化(即變化量),也不是所有從源應(yīng)用系統(tǒng)中傳遞過來的行都與數(shù)據(jù)倉庫有關(guān)。由于無關(guān)數(shù)據(jù)行的處理可能消耗一部分系統(tǒng)的存儲和處理能力,因此數(shù)據(jù)預(yù)備域的下一個任務(wù)是從傳過來的數(shù)據(jù)中過濾不相關(guān)的行。此外,它經(jīng)常需要識別剩下的行的相關(guān)操作以正確地更新數(shù)據(jù)倉庫。
在不失一般性的情況下,為簡單起見,假設(shè)被處理的行來自于源應(yīng)用系統(tǒng)網(wǎng)站的日志,且由5個部分組成。每行的第1部分是標(biāo)識順序的序列號(Sequence_No),這里,該行被添加到該應(yīng)用程序網(wǎng)站的日志中。第2部分是對象鍵(Object_key)或用多行描述的事件的數(shù)量。注意,即使在一個更新周期內(nèi),一個對象或一個事件也可以由多行來描述。第3部分是時間點(diǎn)(Time_Point),即表示對象數(shù)據(jù)的“狀態(tài)開始”(state_start)或事件數(shù)據(jù)的“發(fā)生”(occurred_on)。第4部分是包含描述內(nèi)容的行的業(yè)務(wù)信息(Business_Information)。每一行的第5部分表示2個基本操作(Elementary_Operation)中的一個,即INSERT或DELETE??傊?,輸入行具有下面的模式:
Sequence_No Object_key Time_Point Business_Information Elementary_Operation
假設(shè)輸出行(即處理后剩余的行)有下面的模式:
Object_key Time_Point Business_Informatio n Elementary_Operation Original_Operation
Original_Operation是指通過操作應(yīng)用系統(tǒng)來執(zhí)行相應(yīng)記錄上的原始操作。它們插入一條新記錄,刪除或修改一條已經(jīng)存在的記錄。通過該任務(wù),必須確認(rèn)每個剩余行。僅保留與數(shù)據(jù)倉庫相關(guān)的行做進(jìn)一步處理,其余的都按這種方法過濾掉。此外,為了進(jìn)一步處理,Sequence_No將不會被使用,這樣它就不再保存在輸出行中。
假設(shè)輸入和輸出行分別具有以上描述的格式,則可按以下步驟進(jìn)行過濾:
1)通過對象鍵和時間點(diǎn)組合對所有行進(jìn)行分區(qū);
2)在每個分區(qū)內(nèi),根據(jù)序列號升序排列所有行,注意排序后分區(qū)內(nèi)的第一個行和最后一行;
3)對每一行進(jìn)行下面的操作:
①如果行是分區(qū)中的第一行且基于此行的基本操作是DELETE,那么這個行是相關(guān)的;
②如果行是分區(qū)中的最后一行且基于此行的基本操作是INSERT,那么這個行是相關(guān)的;
4)對每一個相關(guān)的剩余行進(jìn)行以下操作:
①如果在這個行上的基本操作是DELETE,同時,如果這個行是分區(qū)中的最后一個剩余行,那么相關(guān)的原始操作是DELETE;否則,相關(guān)的原始操作是MODIFY;
②如果在這個行上的基本操作是INSERT,且這個行是分區(qū)中的第一個剩余行,那么相關(guān)的原始操作是INSERT;否則,相關(guān)的原始操作是MODIFY。
通過錯誤拒絕、列清洗、行過濾等處理,從各種源應(yīng)用系統(tǒng)來的數(shù)據(jù)基本上消除了數(shù)據(jù)不完整、數(shù)據(jù)不一致、數(shù)據(jù)錯誤、數(shù)據(jù)不準(zhǔn)確、數(shù)據(jù)冗余等數(shù)據(jù)質(zhì)量問題,為數(shù)據(jù)倉庫后續(xù)處理提供數(shù)據(jù)質(zhì)量上的保障。
[1]Kimball,R Reeves L,Ross M,et al.The Data Warehouse Lifecycle Toolkit:Export Methods for Designing,Developing and Developing and Deploying Data Warehouses[M].Indiana:Wiley Publishing Inc.1998.
[2]Loshin D.Data Quality ROI in the Absence of Profits[J].Information & Management,2003(9):22.
[3]Huang K,Lee T,Wang Y W,et al.Quality Information and Knowledge[M],NJ:Prentice-Hall,1999.
[4]Clikeman P M.Improving information quality[J].Internal Auditor,1999(3):32-33.
[5]Kimball R,Ross M.The Data Warehouse Toolkit:the complete guide to dimensional modeling(Second Edition)[M].NEW YORK:Wiley Computer Publishing,2002:7-8.
[6]Bin Jiang.Constructing data warehouses with Metadatadriven Generic Operators and more.Switzerland,DBJ Publishing,2011.
[7]Singh R,Singh K.A descriptive classification of causes of data quality problems in data warehousing[J].International Journal of Computer Science Issues,2010(3).
[8]程大慶,鄭承滿.數(shù)據(jù)倉庫數(shù)據(jù)質(zhì)量的治理及體系構(gòu)建[J].中國金融電腦,2011(6):28-34.
[9]劉潤達(dá).社會化媒體數(shù)據(jù)質(zhì)量評價初探[J].中國科技資源導(dǎo)刊,2012(2):72-79.
[10]Markus Helfert,Gregor Zellner,Carlos Sousa.Data Quality Problems and Proactive Data Quality Management in Data-Warehouse-Systems[EB/OL].[2013-11-12].http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.98.5149&rep=rep1&type=pdf.
[11]Thomas C.Redman,Ph D.Data Warehouses and Quality:Not Just for IT Anymore[J].A Navesink Consulting Group White Paper,2008.
[12]陳林,陳維義.基于數(shù)據(jù)倉庫的海軍要地防空作戰(zhàn)決策支持系統(tǒng)[J].四川兵工學(xué)報(bào),2011,32(7):90-92.