ETL的主要步驟
ETL(Extract Transform Loading, 數(shù)據(jù)抽取轉(zhuǎn)化裝載規(guī)則)是負(fù)責(zé)完成是數(shù)據(jù)源數(shù)據(jù)向數(shù)據(jù)倉庫數(shù)據(jù)的轉(zhuǎn)化的過程。是實(shí)施數(shù)據(jù)倉庫中最重要的步驟??梢孕蜗蟮恼f,ETL的角色相當(dāng)于磚石修葺成 房子的過程。在數(shù)據(jù)倉庫系統(tǒng)設(shè)計(jì)中最難的部分是用戶需求分析和模型設(shè)計(jì),那么工作量最大的就是ETL規(guī)則的設(shè)計(jì)和實(shí)施了,它要占到整個(gè)數(shù)據(jù)倉庫設(shè)計(jì)工作量 的60%-70%,甚至更多。
下面是本人對(duì)ETL的幾個(gè)重要步驟理解,和大家分享!
一、ODS區(qū)的數(shù)據(jù)采集: 最主要作用為了盡量減少對(duì) 業(yè)務(wù)系統(tǒng)的影響。表結(jié)構(gòu)可以不必和DW一致。根據(jù)具體業(yè)務(wù)需求和數(shù)據(jù)量情況,將數(shù)據(jù)源的數(shù)據(jù)放入ODS有各種不同的方法,比如Oracle的數(shù)據(jù)庫鏈路, 表復(fù)制,SQL*LOADER,Teradata的Fastload,Sysbase的BCP等等。
需要解決的問題包括:
a、數(shù)據(jù)的時(shí)間差異性問題
在抽取舊有數(shù)據(jù)時(shí),要將不同時(shí)期的數(shù)據(jù)定義統(tǒng)一,較早的數(shù)據(jù)不夠完整或不符合新系統(tǒng)的數(shù)據(jù)規(guī)范,一般可以根據(jù)規(guī)則,在存入中轉(zhuǎn)區(qū)的過程中予以更新或補(bǔ)充。
b、數(shù)據(jù)的平臺(tái)多樣性問題
在抽取舊有數(shù)據(jù)時(shí),大部分?jǐn)?shù)據(jù)都可采用表復(fù)制方式直接導(dǎo)入數(shù)據(jù)中轉(zhuǎn)區(qū)集中,再做處理,但有部分?jǐn)?shù)據(jù)可能需要轉(zhuǎn)換成文本文件或使用第三方工具如 Informatica等裝載入數(shù)據(jù)中轉(zhuǎn)區(qū)。這部分?jǐn)?shù)據(jù)主要是與數(shù)據(jù)中轉(zhuǎn)區(qū)數(shù)據(jù)庫平臺(tái)不一致的數(shù)據(jù)庫數(shù)據(jù),或非存儲(chǔ)于數(shù)據(jù)庫內(nèi)的文本、excel等數(shù)據(jù)。
c 、數(shù)據(jù)的不穩(wěn)定性問題
對(duì)于重要信息的完整歷史變更記錄,在抽取時(shí)可以根據(jù)各時(shí)期的歷史信息,在抽取需要信息等基本屬性的舊有數(shù)據(jù)時(shí),要與相應(yīng)時(shí)段的信息關(guān)聯(lián)得到真實(shí)的歷史屬性。
d 、數(shù)據(jù)的依賴性問題
舊有業(yè)務(wù)系統(tǒng)的數(shù)據(jù)關(guān)聯(lián)一般已有約束保證,代碼表和參照表等數(shù)據(jù)也比較準(zhǔn)確,但仍有少量數(shù)據(jù)不完整,對(duì)這部分?jǐn)?shù)據(jù),需根據(jù)地稅的需求采取清洗策略,保證數(shù)據(jù)倉庫各事實(shí)表和維表之間的關(guān)聯(lián)完整有效。
數(shù)據(jù)倉庫各事實(shí)表和維表的初始裝載順序有先后關(guān)系,要有一個(gè)集中的數(shù)據(jù)裝載任務(wù)順序方案,確保初始數(shù)據(jù)裝載的準(zhǔn)確。這可以通過操作系統(tǒng)或第三方工具的任務(wù)調(diào)度機(jī)制來保證。
二、數(shù)據(jù)轉(zhuǎn)換、清洗:
將ODS中的數(shù)據(jù),按照數(shù)據(jù)倉庫中數(shù)據(jù)存儲(chǔ)結(jié)構(gòu)進(jìn)行合理的轉(zhuǎn)換,轉(zhuǎn)換步驟一般還要包含數(shù)據(jù)清洗的過程。數(shù)據(jù)清洗主要是針對(duì)源數(shù)據(jù)庫中出現(xiàn)二義性、重復(fù)、不完整、違反業(yè)務(wù)或邏輯規(guī)則等問題的數(shù)據(jù)數(shù)據(jù)進(jìn)行統(tǒng)一的處理,一般包括如:NULL值處理,日期格式轉(zhuǎn)換,數(shù)據(jù)類型轉(zhuǎn)換等等。在清洗之前需要進(jìn)行數(shù)據(jù)質(zhì)量分析,以找出存在問題的數(shù)據(jù),否則數(shù)據(jù)清洗將無從談起。數(shù)據(jù)裝載是通過裝載工具或自行編寫的SQL程序?qū)⒊槿?、轉(zhuǎn)換后的結(jié)果數(shù)據(jù)加載到目標(biāo)數(shù)據(jù)庫中。
數(shù)據(jù)質(zhì)量問題具體表現(xiàn)在以下幾個(gè)方面:
a、正確性(Accuracy):數(shù)據(jù)是否正確的表示了現(xiàn)實(shí)或可證實(shí)的來源?
b、完整性(Integrity):數(shù)據(jù)之間的參照完整性是否存在或一致?
c、一致性(Consistency):數(shù)據(jù)是否被一致的定義或理解?
d、完備性(Completeness):所有需要的數(shù)據(jù)都存在嗎?
e、有效性(Validity):數(shù)據(jù)是否在企業(yè)定義的可接受的范圍之內(nèi)?
f、時(shí)效性(Timeliness):數(shù)據(jù)在需要的時(shí)侯是有效的嗎?
g、可獲取性(Accessibility):數(shù)據(jù)是否易于獲取、易于理解和易于使用?
以下綜合說明數(shù)據(jù)倉庫中數(shù)據(jù)質(zhì)量要求,包括格式、完整性要求。
a、業(yè)務(wù)描述統(tǒng)一,對(duì)數(shù)據(jù)模型的不同版本融合、映射為唯一版本。包括:
1、在業(yè)務(wù)邏輯沒有變化的前提下,舊的業(yè)務(wù)數(shù)據(jù)映射在新模型上。
2、 遺留系統(tǒng)的人事信息、考核相關(guān)信息與業(yè)務(wù)系統(tǒng)、行政其他模塊要一致。
b、信息描述規(guī)范、完整。
1、不存在格式違規(guī)
數(shù)據(jù)類型不存在潛在錯(cuò)誤。
2 、參照完整性未被破壞
數(shù)據(jù)不會(huì)找不到參照。
3 、不存在交叉系統(tǒng)匹配違規(guī),數(shù)據(jù)被很好集成
相同的數(shù)據(jù)存在于多個(gè)系統(tǒng)中,數(shù)據(jù)之間要匹配。
4 、數(shù)據(jù)在內(nèi)部一致
同樣的紀(jì)錄字段在同一個(gè)表中重復(fù)出現(xiàn),不能有差別。
以下是對(duì)主要數(shù)據(jù)質(zhì)量問題的清洗策略:
主要問題 | 表現(xiàn)形式 | 產(chǎn)生原因 | 清洗策略 |
數(shù)據(jù)完整性問題 | 大量的空值字段的出現(xiàn) | 原OLTP系統(tǒng)中對(duì)很多字段沒有做非空限制 | 1. |
超出字典表范圍 | 填寫這些值的時(shí)候是直接讓用戶填寫而非下拉框選擇 | 1. 交由OLTP系統(tǒng)重新錄入, 補(bǔ)齊 | |
數(shù)據(jù)一致性問題 | 一個(gè)特定的字段在不同的表中內(nèi)容不同 | 錄入, 同步的問題 | 1. 選取最可靠的表中的字段為確定值 |
應(yīng)該成為主鍵的值不唯一 | 原OLTP系統(tǒng)中未建立有效的主鍵關(guān)系 | 1. 消除錯(cuò)誤, 重復(fù)的主鍵 |
三、數(shù)據(jù)加載:
將轉(zhuǎn)換和清洗完的數(shù)據(jù)按照數(shù)據(jù)倉庫的結(jié)構(gòu)進(jìn)行數(shù)據(jù)加載。需要考慮初始數(shù)據(jù)裝載、數(shù)據(jù)刷新、加載順序等等問題。
a、針對(duì)數(shù)據(jù)現(xiàn)狀,初始導(dǎo)入有這樣一些問題需要考慮:
1、如何解決時(shí)間差異性?
2、如何解決平臺(tái)差異性?
3、如何適應(yīng)數(shù)據(jù)的不穩(wěn)定性?
4、如何解決數(shù)據(jù)依賴性?
b、數(shù)據(jù)刷新的策略要根據(jù)業(yè)務(wù)需求和應(yīng)用系統(tǒng)的承受能力和數(shù)據(jù)情況決定。主要有這樣一些問題需要考慮:1、如何解決時(shí)間差異性?
2、如何適應(yīng)數(shù)據(jù)的不穩(wěn)定性?
3、如何解決平臺(tái)差異性?
4、如何解決數(shù)據(jù)依賴性?
5、如何減少對(duì)業(yè)務(wù)系統(tǒng)的影響?
c、不同的刷新任務(wù)類型,對(duì)業(yè)務(wù)系統(tǒng)的影響不同,刷新任務(wù)有以下種歸類特性:
1、刷新頻率:
實(shí)時(shí)刷新、每數(shù)小時(shí)、每日、每周、每月、不定期手動(dòng)刷新。
2、刷新方式:
數(shù)據(jù)庫表復(fù)制、文本文件ftp再裝載、物化視圖、數(shù)據(jù)庫trigger。
3、數(shù)據(jù)加工方式:
簡(jiǎn)單插入更新、增加計(jì)算項(xiàng)字段、多表關(guān)聯(lián)更新、匯總、多表關(guān)聯(lián)匯總計(jì)算。
并可針對(duì)各種異常情況做處理:回滾,重新裝載,斷點(diǎn)重新裝載等等,還可在任務(wù)完成后(或失敗后)將日志以Email方式發(fā)給數(shù)據(jù)倉庫管理人員。
四、匯總層、CUBE加載:
ODS加載進(jìn)入數(shù)據(jù)倉庫的數(shù)據(jù)只是底層詳細(xì)層數(shù)據(jù),還需按定義的匯總規(guī)則進(jìn)行匯總,生成數(shù)據(jù)集市用的匯總表或CUBE。ETL流程是指完成每個(gè)維表數(shù)據(jù)及事實(shí)表數(shù)據(jù)導(dǎo)入的順序, 其包括兩個(gè)部分, 初始導(dǎo)入數(shù)據(jù)時(shí)的ETL流程, 及增量導(dǎo)入時(shí)的ETL流程。
初始導(dǎo)入數(shù)據(jù)時(shí)的ETL流程
第一步: 自動(dòng)生成維的數(shù)據(jù)裝載
自動(dòng)生成維一般來說就是日期,年度月份,年度等時(shí)間類維度(年度月份,年度其實(shí)都是日期維的一個(gè)層次,但某些事實(shí)表中沒有日期信息,只有月份信息,所以需額外建立此二維度),幾乎數(shù)據(jù)倉庫中每個(gè)數(shù)據(jù)模型都需使用時(shí)間類維度,在加載其它維度和事實(shí)之前,需要先將時(shí)間維度生成出來。
第二步: 手工維護(hù)維度裝載
實(shí)際數(shù)據(jù)倉庫開發(fā)中,很可能會(huì)有些維度的數(shù)據(jù)在業(yè)務(wù)系統(tǒng)中無發(fā)得到,典型的是一些外部信息指表的類型代碼,是由數(shù)據(jù)倉庫開發(fā)人員設(shè)計(jì)的。所以需要手工方式建立這些信息,然后導(dǎo)入數(shù)據(jù)倉庫。
第三步: 緩慢變化維表數(shù)據(jù)裝載
這些維度可以從業(yè)務(wù)系統(tǒng)中找到來源,但變化比較緩慢。對(duì)于初始裝載時(shí),需要考慮對(duì)緩慢變化維的處理方式要和增量刷新方式一致。
在裝載事實(shí)表數(shù)據(jù)之前,需要先裝載這些維表。需要注意的是,有些維本身就是事實(shí)表,其所依賴的維必須先裝載完成。
第四步: 事實(shí)表數(shù)據(jù)裝載
然后是初始裝載所有的事實(shí)表數(shù)據(jù)。事實(shí)表之間也有依賴關(guān)系,某些事實(shí)表需在其他事實(shí)表裝載之前裝載。(如果ETL程序已保障了數(shù)據(jù)的完整性,也可以在將關(guān)聯(lián)約束禁用的情況下不考慮先后順序,但一般不建議)。
第五步:聚合表初始生成
許多數(shù)據(jù)倉庫的前端應(yīng)用,并非直接使用主題星型模型中的事實(shí)表數(shù)據(jù),而是聚合表中匯總,運(yùn)算好的數(shù)據(jù)。(Oracle OLAP Service所建立的ROLAP 和數(shù)據(jù)集市實(shí)際上也是使用一系列的經(jīng)過大量預(yù)先計(jì)算得到的聚合表)
增量導(dǎo)入
第一步: 緩慢變化維表數(shù)據(jù)裝載
每天將所有變化過的維度信息刷新到數(shù)據(jù)倉庫中,維表數(shù)據(jù)的刷新必須現(xiàn)于事實(shí)表。
第二步: 事實(shí)表數(shù)據(jù)裝載階段
每天新增事實(shí)數(shù)據(jù)的導(dǎo)入,如同初始化導(dǎo)入一樣,需要考慮任務(wù)之間的先后順序。
第三步: 數(shù)據(jù)匯總和聚合
根據(jù)設(shè)定的聚合規(guī)則和時(shí)間段對(duì)數(shù)據(jù)進(jìn)行聚合。
第四步: 作業(yè)調(diào)度和異常情況處理
五、任務(wù)調(diào)度策略
驅(qū)動(dòng)策略
前導(dǎo)Job驅(qū)動(dòng):只有滿足另外一個(gè)JOB成功后,自己才運(yùn)行。文件驅(qū)動(dòng):當(dāng)下傳的文件到達(dá),并經(jīng)過檢驗(yàn)準(zhǔn)確后JOB才運(yùn)行。時(shí)間驅(qū)動(dòng):當(dāng)?shù)竭_(dá)某個(gè)時(shí)點(diǎn)時(shí),Job便開始運(yùn)行。事件驅(qū)動(dòng):如人工參與,導(dǎo)致JOB執(zhí)行。
通知設(shè)計(jì):重要信息(成功/失?。┑耐ㄖ?/span>
1、成功退出
分段提交方式,當(dāng)分段提交的當(dāng)次任務(wù)都正確完成,即Job運(yùn)行狀態(tài)臨時(shí)表中登記的作業(yè)狀態(tài)全部為完成時(shí),退出ETL調(diào)度。
自動(dòng)提交方式,當(dāng)當(dāng)期所有的任務(wù)都正確完成,即Job運(yùn)行狀態(tài)表中登記的作業(yè)狀態(tài)全部為完成時(shí),退出ETL調(diào)度。
2、失敗退出
關(guān)鍵作業(yè)異常,關(guān)鍵作業(yè)運(yùn)行異常時(shí),影響剩下的作業(yè)不能運(yùn)行時(shí),則退出ETL調(diào)度。
超過ETL時(shí)限,當(dāng)超過預(yù)先設(shè)定的ETL?時(shí)限時(shí),退出ETL調(diào)度。
數(shù)據(jù)庫異常,當(dāng)不能正常操作數(shù)據(jù)庫時(shí),退出ETL調(diào)度。
操作系統(tǒng)異常,當(dāng)發(fā)生操作系統(tǒng)異常,導(dǎo)致程序不能正常運(yùn)行,如文件系統(tǒng)異常導(dǎo)致讀寫文件錯(cuò)時(shí),需要退出ETL調(diào)度。
3、手工退出,需要人為干預(yù)ETL調(diào)度的時(shí)候,能以手工操作的方式退出ETL調(diào)度。
聯(lián)系客服