ETL簡介


 

ETL(Extract-Transform-Load的縮寫,即數據抽取、轉換、裝載的過程)

信息是現代企業的重要資源,是企業運用科學管理、決策分析的基礎。目前,大多數企業花費大量的資金和時間來構建聯機事務處理OLTP的業務系統和辦公自動化系統,用來記錄事務處理的各種相關數據。據統計,數據量每23年時間就會成倍增長,這些數據蘊含着巨大的商業價值,而企業所關注的通常只占在總數據量的2%4%左右。因此,企業仍然沒有最大化地利用已存在的數據資源,以致於浪費了更多的時間和資金,也失去制定關鍵商業決策的最佳契機。於是,企業如何通過各種技術手段,並把數據轉換為信息、知識,已經成了提高其核心競爭力的主要瓶頸。而ETL則是主要的一個技術手段。

ETL(Extract-Transform-Load的縮寫,即數據抽取、轉換、裝載的過程)作為BI/DWBusiness Intelligence)的核心和靈魂,能夠按照統一的規則集成並提高數據的價值,是負責完成數據從數據源向目標數據倉庫轉化的過程,是實施數據倉庫的重要步驟。如果說數據倉庫的模型設計是一座大廈的設計藍圖,數據是磚瓦的話,那么ETL就是建設大廈的過程。

 

 

ETL體系結構圖

 

 

一、      准備工作

1確定源數據范圍,包括確定數據的來源、存儲方式、數據結構、數據量大小、數據增長情況、數據更新頻率。

2)探查源系統數據質量發現數據質量問題,以便針對具體問題,在數據進入數據倉庫之前提出修正方法

二、      數據抽取

全量抽取:全量抽取類似於數據遷移或數據復制,它將數據源中的表或視圖的數據原封不動的從數據庫中抽取出來,並轉換成自己的ETL工具可以識別的格式。全量抽取比較簡單.

增量抽取:增量抽取只抽取自上次抽取以來數據庫中要抽取的表中新增或修改的數據。在ETL使用過程中。增量抽取較全量抽取應用更廣。如何捕獲變化的數據是增量抽取的關鍵。對捕獲方法一般有兩點要求:准確性,能夠將業務系統中的變化數據按一定的頻率准確地捕獲到; 性能,不能對業務系統造成太大的壓力,影響現有業務。

ETL處理的數據源除了關系數據庫外,還可能是文件,例如txt文件、excel文件、xml文件等。對文件數據的抽取一般是進行全量抽取,一次抽取前可保存文件的時間戳或計算文件的MD5校驗碼,下次抽取時進行比對,如果相同則可忽略本次抽取

為什么要全量抽取?

l     對歷史數據進行抽取;

為什么要增量抽取?

l        表數據量大時,每次全抽數據量太大

l     為了記錄數據的歷史變化情況;

 

增量數據抽取時,變化數據捕獲是主要技術環節。

                             變化數據捕獲方法

各種捕獲方法對比:

觸發器:

    在要抽取的表上建立需要的觸發器,一般要建立插入、修改、刪除三個觸發器,

每當源表中的數據發生變化,就被相應的觸發器將變化的數據寫入一個臨時表,

抽取線程從臨時表中抽取數據,臨時表中抽取過的數據被標記或刪除。

優點:數據抽取性的能比較高

缺點:要求業務表建立觸發器,對業務有一定影響

時間戳:

    它是一種基於快照比較的變化數據捕獲方式,在源表上增加一個時間戳字段,系統中更新修

改表數據的時候,同時修改時間戳字段的值。當進行數據抽取時,通過比較系統時間與時間

戳字段的值來決定抽取哪些數據。有的數據庫的時間戳支持自動更新,即表的其它字段的數

據發生改變時,自動更新時間戳字段的值。有的數據庫不支持時間戳的自動更新,這就要求

業務系統在更新業務數據時,手工更新時間戳字段。

優點:數據抽取性的能比較高

缺點:

1)對業務系統有侵入性(加入了額外的時間戳)

2)對於不支持時間戳自動更新的數據庫,有額外的更新時間戳的操作;

3無法捕獲以前數據的delete,update等操作,數據准確性有一定限制;

全表比對

典型的全表比對的方式是采用MD5校驗碼。ETL工具事先為要抽取的表建立一個結構類似的MD5臨時表,該臨時表記錄源表主鍵以及根據所有字段的數據計算出來的MD5校驗碼。每次

進行數據抽取時,對源表和MD5臨時表進行MD5校驗碼的比對,從而決定源表中的數據是新

增、修改還是刪除,同時更新MD5校驗碼。

優點:對業務系統的侵入性小

缺點:

    1性能較差

    2)當表中沒有主鍵或唯一列且含有重復記錄時,MD5方式的准確性較差

CDC

    通過分析數據庫自身的日志來判斷變化的數據。Oracle的改變數據捕獲(CDC)技術是這

方面的代表。CDC 特性是在Oracle9i數據庫中引入的。CDC能夠幫助你識別從上次抽取之

后發生變化的數據。利用CDC,在對源表進行insertupdate delete等操作的同時就可以

提取數據,並且變化的數據被保存在數據庫的變化表中。這樣就可以捕獲發生變化的數據

,然后利用數據庫視圖以一種可控的方式提供給目標系統。CDC分為同步模式和異步模式,

同步模式實時的捕獲變化數據並存儲到變化表中。異步模式則是基於Oracle的流復制技術。

優點:

1)    對於抽取性能比較高

2)    對於異步方式,采用的是日志傳輸,對業務系統侵入性小

缺點:

1) 對於同步方式,對源業務系統壓力比較大;

2) 創建ORACLE CDC時,需要申請大量權限,需要DBA同意;

3) 對於異步方式的CDC,由於采用的是日志分析方式,一旦數據庫日志滿了或日志被DBA刪掉,則變化數據就捕獲不到了。

MINUS

對於擁有集合運算函數數據庫例如oracle擁有minus,可以根據一些主鍵做集合運算,將差異結果存到單獨的表中供其它程序讀取。

優點:能夠很方便的捕獲到變化的數據

缺點:當數據量很大時,性能較低。

抽取技巧:

三、  數據清洗與轉換

數據清洗是為了解決抽取出來的數據質量不高的問題,如:

1.數據不完整。這種情況比較多,例如記錄的缺失、字段信息的缺失、記錄不完整等。最明顯的例子就是用戶入網登記的證件號碼沒有輸入到系統。
    2.
數據不一致。這種情況主要指由於系統之間或者功能模塊之間記錄不一致、編碼不一致、引用不一致等。例如在97系統、計費系統、網管系統中由於業務受理處理流程不規范,或者系統之間同步時間不一致導致了不同系統中用戶記錄數不一致。
    3.
數據有錯誤。這種情況主要是指數據中存在各種不合法的情況,例如數據類型錯誤、數據范圍越界、數據違反業務規則等。
除了第三種情況是明顯的數據錯誤之外,其他兩種都不能簡單地認為是錯誤,這兩種情況在數據倉庫建設中是比較普遍遇到的,關鍵是對數據質量的狀況有深入的認識,在應用上加以注意。

數據清洗方法:

1)手工實現方式:用人工來檢測所有的錯誤並改正。這只能針對小數據量的數據源。

2)專門編寫的應用程序:通過編寫程序檢測/改正錯誤。但通常數據清洗是一個反復進行的過程,清理程序復雜、系統工作量大。

3)運用數據清洗工具:某類特定應用領域的問題,如根據概率統計學原理查找數值異常的記錄。

4)與特定應用領域無關的數據清洗:這一部分應用非常有限,主要集中於重復記錄的檢測/刪除。

數據清洗的一部分工作是通過數據轉換來完成的

l      數據不一致

l      數據粒度

l      業務規則的計算

大小交,這種處理在數據清洗過程是常見了,例如從數據源到ODS階段,如果數據倉庫采用維度建模,而且維度基本采用代理鍵的話,必然存在代碼到 此鍵值的轉換。如果用SQL實現,必然需要將一個大表和一堆小表都Join起來,當然如果使用ETL 工具的話,一般都是先將小表讀入內存中再處理。這種情況,輸出數據的粒度和大表一樣。

大大交,大表和大表之間關聯也是一個重要的課題,當然其中要有一個主表,在邏輯上,應當是主表Left Join輔表。大表之間的關聯存在最大的問題就是性能和穩定性,對於海量數據來說,必須有優化的方法來處理他們的關聯,另外,對於大數據的處理無疑會占用 太多的系統資源,出錯的幾率非常大,如何做到有效錯誤恢復也是個問題。對於這種情況,我們建議還是盡量將大表拆分成適度的稍小一點的表,形成大小交的類 型。這類情況的輸出數據粒度和主表一樣。

站着進來,躺着出去。事務系統中為了提高系統靈活性和擴展性,很多信息放在代碼表中維護,所以它的事實表就是一種窄表,而在數據倉庫中,通 常要進行寬化,從行變成列,所以稱這種處理情況叫做站着進來,躺着出去。大家對Decode肯定不陌生,這是進行寬表化常見的手段之一。窄表變寬表的 過程主要體現在對窄表中那個代碼字段的操作。這種情況,窄表是輸入,寬表是輸出,寬表的粒度必定要比窄表粗一些,就粗在那個代碼字段上。

聚集。數據倉庫中重要的任務就是沉淀數據,聚集是必不可少的操作,它是粗化數據粒度的過程。聚集本身其實很簡單,就是類似SQLGroup by的操作,選取特定字段(維度),對度量字段再使用某種聚集函數。但是對於大數據量情況下,聚集算法的優化仍是探究的一個課題。例如是直接使用SQL Group by,還是先排序,在處理。

直接映射,原來是什么就是什么,原封不動照搬過來,對這樣的規則,如果數據源字段和目標字段長度或精度不符,需要特別注意看是否真的可以直接映射還是需要做一些簡單運算。

字段運算,數據源的一個或多個字段進行數學運算得到的目標字段,這種規則一般對數值型字段而言。

參照轉換,在轉換中通常要用數據源的一個或多個字段作為Key,去一個關聯數組中去搜索特定值,而且應該只能得到唯一值。這個關聯數組使用Hash算法實現是比較合適也是最常見的,在整個ETL開始之前,它就裝入內存,對性能提高的幫助非常大。

字符串處理,從數據源某個字符串字段中經常可以獲取特定信息,例如身份證號。而且,經常會有數值型值以字符串形式體現。對字符串的操作通常有類型轉換、字符串截取等。但是由於字符類型字段的隨意性也造成了臟數據的隱患,所以在處理這種規則的時候,一定要加上異常處理。

空值判斷,對於空值的處理是數據倉庫中一個常見問題,是將它作為臟數據還是作為特定一種維成員?這恐怕還要看應用的情況,也是需要進一步探求 的。但是無論怎樣,對於可能有NULL值的字段,不要采用直接映射的規則類型,必須對空值進行判斷,目前我們的建議是將它轉換成特定的值。

日期轉換,在數據倉庫中日期值一般都會有特定的,不同於日期類型值的表示方法,例如使用8位整型20040801表示日期。而在數據源中,這種字段基本都是日期類型的,所以對於這樣的規則,需要一些共通函數來處理將日期轉換為8位日期值、6位月份值等。

日期運算,基於日期,我們通常會計算日差、月差、時長等。一般數據庫提供的日期運算函數都是基於日期型的,而在數據倉庫中采用特定類型來表示日期的話,必須有一套自己的日期運算函數集。

聚集運算,對於事實表中的度量字段,他們通常是通過數據源一個或多個字段運用聚集函數得來的,這些聚集函數為SQL標准中,包括sum,count,avg,min,max

既定取值,這種規則和以上各種類型規則的差別就在於它不依賴於數據源字段,對目標字段取一個固定的或是依賴系統的值

四、      數據加載

  維表提供了事實表的上下文。雖然維表通常比事實表小得多,但它卻是數據倉庫的核心,因為它提供了查看數據的入口。我們經常說建立數據倉庫其實就是建立維度。因此ETL團隊在數據加載階段的主要任務就是處理維表和事實表,將最有效的應用方式提交給最終用戶。

維度的加載方式

Ø       手動生成維表最簡單;

Ø       對於復雜、大型的維度表,需要進行清洗和規范化;

Ø       緩慢變化需要進行管理,以正確的主鍵,在適當的維度格式中寫入物理磁盤。

緩慢變化維(SCD)加載:

覆蓋:當某個維度成員的數據發生變化時,最新的列值將覆蓋以前的維度記錄,從而清除了該維度成員的歷史記錄

區分歷史:當某個維度成員的數據發生變化時,最新的列值將存儲為維度中的新記錄,從而提供了一個維度成員的多個實例,這樣便保留了歷史記錄

交替實體:當某個維度成員的列數據發生變化,而數據倉庫要保留該變化列的最后一個版本時,原始數據將移到該維度記錄的最后一個版本列中,並且所有新維度信息將覆蓋現有列。

單獨處理數據插入。很多ETL 工具(以及一些數據庫)提供update else insert 功能。這個功能非常方便,且有着非常簡單的數據流程邏輯,但是性能非常的低。ETL過程對已經存在的數據的更新邏輯中包括區分那些已經存儲在事實表中記錄和新數據。當處理大量的數據的任何時候,你想到的是數據批量加載到數據倉庫。但是不幸的是,很多批量導入工具不支持更改已經存在的記錄。通過分離需要更新的記錄,你可以先處理更新,然后再執行批量的導入,這樣獲得最佳的加載性能。
    
利用批量加載工具。使用批量加載工具,而非使用SQL 語句加載大量數據可以降低數據庫負載,並極大的提高加載效率。 
    
並行的加載。在加載大量數據的時候,將數據物理上分成不同的邏輯段。如果加載年的數據,你可以做個數據文件,每個文件中包含一年的數據。一些ETL 工具允許你根據數據范圍進行數據分區。一旦數據被分成均等的部分,運行ETL 程並行的加載所有的分段。  

最小化物理更新。在表中更新記錄操作需要耗用DBMS 很多資源,最大的原因是數據庫要生成回滾日志。要最小化對回滾日志的操作,可以采用批量的加載數據。如何處理那些需要更新的數據呢?很多情況下,最佳的方式是刪除要更新的記錄,然后批量的加載所有的數據。由於要做更新的數據和總的數據量的比率會極大的影響優化方式的選擇,因此需要一些反復測試來判斷針對具體情況的最終加載策略。  

在數據庫外進行聚合。在數據庫之外進行排序,合並和聚合要比在DBMS 內使用SQL 語句,使用COUNT SUM 函數,GROUP BY  ORG ER BY 關鍵字高效的多。ETL 過程需要將巨大數量的數據進行排序、合並放在進入關系型數據庫准備區之前完成。很多ETL 工具提供這些功能,但是專門的工具在操作系統級別執行排序/合並意味着為處理大數據集進行額外的投資。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM