ETL(Extract/Transformation/Load)是BI/DW的核心和靈魂,按照統一的規則集成並提高數據的價值,是負責完成數據從數據源向目標數據倉庫轉化的過程,是實施數據倉庫的重要步驟。
ETL過程中的主要環節就是數據抽取、數據轉換和加工、數據裝載。為了實現這些功能,各個ETL工具一般會進行一些功能上的擴充,例如工作流、調度引擎、規則引擎、腳本支持、統計信息等。
數據抽取
數據抽取是從數據源中抽取數據的過程。實際應用中,數據源較多采用的是關系數據庫。從數據庫中抽取數據一般有以下幾種方式。
(1)全量抽取 全量抽取類似於數據遷移或數據復制,它將數據源中的表或視圖的數據原封不動的從數據庫中抽取出來,並轉換成自己的ETL工具可以識別的格式。全量抽取比較簡單。
(2)增量抽取 增量抽取只抽取自上次抽取以來數據庫中要抽取的表中新增或修改的數據。在ETL使用過程中。增量抽取較全量抽取應用更廣。如何捕獲變化的數據是增量抽取的關鍵。對捕獲方法一般有兩點要求:准確性,能夠將業務系統中的變化數據按一定的頻率准確地捕獲到;性能,不能對業務系統造成太大的壓力,影響現有業務。目前增量數據抽取中常用的捕獲變化數據的方法有:
a.觸發器:在要抽取的表上建立需要的觸發器,一般要建立插入、修改、刪除三個觸發器,每當源表中的數據發生變化,就被相應的觸發器將變化的數據寫入一個臨時表,抽取線程從臨時表中抽取數據,臨時表中抽取過的數據被標記或刪除。觸發器方式的優點是數據抽取的性能較高,缺點是要求業務表建立觸發器,對業務系統有一定的影響。
b.時間戳:它是一種基於快照比較的變化數據捕獲方式,在源表上增加一個時間戳字段,系統中更新修改表數據的時候,同時修改時間戳字段的值。當進行數據抽取時,通過比較系統時間與時間戳字段的值來決定抽取哪些數據。有的數據庫的時間戳支持自動更新,即表的其它字段的數據發生改變時,自動更新時間戳字段的值。有的數據庫不支持時間戳的自動更新,這就要求業務系統在更新業務數據時,手工更新時間戳字段。同觸發器方式一樣,時間戳方式的性能也比較好,數據抽取相對清楚簡單,但對業務系統也有很大的傾入性(加入額外的時間戳字段),特別是對不支持時間戳的自動更新的數據庫,還要求業務系統進行額外的更新時間戳操作。另外,無法捕獲對時間戳以前數據的delete和update操作,在數據准確性上受到了一定的限制。
c.全表比對:典型的全表比對的方式是采用MD5校驗碼。ETL工具事先為要抽取的表建立一個結構類似的MD5臨時表,該臨時表記錄源表主鍵以及根據所有字段的數據計算出來的MD5校驗碼。每次進行數據抽取時,對源表和MD5臨時表進行MD5校驗碼的比對,從而決定源表中的數據是新增、修改還是刪除,同時更新MD5校驗碼。MD5方式的優點是對源系統的傾入性較小(僅需要建立一個MD5臨時表),但缺點也是顯而易見的,與觸發器和時間戳方式中的主動通知不同,MD5方式是被動的進行全表數據的比對,性能較差。當表中沒有主鍵或唯一列且含有重復記錄時,MD5方式的准確性較差。
d.日志對比:通過分析數據庫自身的日志來判斷變化的數據。Oracle的改變數據捕獲(CDC,ChangedDataCapture)技術是這方面的代表。CDC特性是在Oracle9i數據庫中引入的。CDC能夠幫助你識別從上次抽取之后發生變化的數據。利用CDC,在對源表進行insert、update或delete等操作的同時就可以提取數據,並且變化的數據被保存在數據庫的變化表中。這樣就可以捕獲發生變化的數據,然后利用數據庫視圖以一種可控的方式提供給目標系統。CDC體系結構基於發布者/訂閱者模型。發布者捕捉變化數據並提供給訂閱者。訂閱者使用從發布者那里獲得的變化數據。通常,CDC系統擁有一個發布者和多個訂閱者。發布者首先需要識別捕獲變化數據所需的源表。然后,它捕捉變化的數據並將其保存在特別創建的變化表中。它還使訂閱者能夠控制對變化數據的訪問。訂閱者需要清楚自己感興趣的是哪些變化數據。一個訂閱者可能不會對發布者發布的所有數據都感興趣。訂閱者需要創建一個訂閱者視圖來訪問經發布者授權可以訪問的變化數據。CDC分為同步模式和異步模式,同步模式實時的捕獲變化數據並存儲到變化表中,發布者與訂閱都位於同一數據庫中。異步模式則是基於Oracle的流復制技術。
ETL處理的數據源除了關系數據庫外,還可能是文件,例如txt文件、excel文件、xml文件等。對文件數據的抽取一般是進行全量抽取,一次抽取前可保存文件的時間戳或計算文件的MD5校驗碼,下次抽取時進行比對,如果相同則可忽略本次抽取。
數據轉換和加工
從數據源中抽取的數據不一定完全滿足目的庫的要求,例如數據格式的不一致、數據輸入錯誤、數據不完整等等,因此有必要對抽取出的數據進行數據轉換和加工。 數據的轉換和加工可以在ETL引擎中進行,也可以在數據抽取過程中利用關系數據庫的特性同時進行。
(1)ETL引擎中的數據轉換和加工
ETL引擎中一般以組件化的方式實現數據轉換。常用的數據轉換組件有字段映射、數據過濾、數據清洗、數據替換、數據計算、數據驗證、數據加解密、數據合並、數據拆分等。這些組件如同一條流水線上的一道道工序,它們是可插拔的,且可以任意組裝,各組件之間通過數據總線共享數據。 有些ETL工具還提供了腳本支持,使得用戶可以以一種編程的方式定制數據的轉換和加工行為。
(2)在數據庫中進行數據加工
關系數據庫本身已經提供了強大的SQL、函數來支持數據的加工,如在SQL查詢語句中添加where條件進行過濾,查詢中重命名字段名與目的表進行映射,substr函數,case條件判斷等等。
相比在ETL引擎中進行數據轉換和加工,直接在SQL語句中進行轉換和加工更加簡單清晰,性能更高。對於SQL語句無法處理的可以交由ETL引擎處理。
數據裝載
將轉換和加工后的數據裝載到目的庫中通常是ETL過程的最后步驟。裝載數據的最佳方法取決於所執行操作的類型以及需要裝入多少數據。當目的庫是關系數據庫時,一般來說有兩種裝載方式:
(1)直接SQL語句進行insert、update、delete操作。
(2)采用批量裝載方法,如bcp、bulk、關系數據庫特有的批量裝載工具或api。 大多數情況下會使用第一種方法,因為它們進行了日志記錄並且是可恢復的。但是,批量裝載操作易於使用,並且在裝入大量數據時效率較高。使用哪種數據裝載方法取決於業務系統的需要。
常見的數據質量問題
數據質量 |
問題 |
數據問題示例 |
格式 |
值是否按照一致的格式標准? |
電話號碼 # 可能顯示為 xxxxxxxxxx, (xxx) xxx-xxxx, 1.xxx.xxx.xxxx, 等. |
標准 |
數據元素是否一致性定義和理解 ? |
一個系統性別代碼 = M, F, U ,另一個系統性別代碼 = 0, 1, 2 |
一致性 |
值是否代表統一的含義? |
營業額是否總是顯示為美元還是也有可能為? |
完整性 |
是否所有必須的數據都包含? |
20% 的顧客的 last name 為空, |
精確性 |
數據是否准確地反映現實或可驗證的數據來源? |
供應商顯示為‘活動’,但是其實6年前已經和它沒有業務往來。 |
有效性 |
數據值是否在接受的范圍內? |
薪水值應該在 60,000-120,000 |
重復性 |
數據多次出現 |
John Ryan 和 Jack Ryan 都在系統中出現了 – 他們是同一個人嗎? |