01 數(shù)據(jù)倉庫簡介

對于每一種技術(shù),先要理解相關(guān)的概念和它之所以出現(xiàn)的原因,這對于我們繼續(xù)深入學(xué)習(xí)其技術(shù)細節(jié)大有裨益。本章將介紹數(shù)據(jù)倉庫的定義,它和傳統(tǒng)操作型數(shù)據(jù)庫
應(yīng)用的區(qū)別,以及為什么我們需要數(shù)據(jù)倉庫。
在對數(shù)據(jù)倉庫的概念有了一個基本的認識后,向讀者介紹四種常見的數(shù)據(jù)倉庫架構(gòu),然后說明 ETL 這個重要的數(shù)據(jù)倉庫概念。本章最后概要介紹對于一個數(shù)據(jù)倉庫的
基本需求和數(shù)據(jù)需求。

1.1 什么是數(shù)據(jù)倉庫

數(shù)據(jù)倉庫的概念可以追溯到 20 世紀 80 年代,當時 IBM 的研究人員開發(fā)出了 “ 商業(yè)數(shù)據(jù)倉庫 ” 。本質(zhì)上,數(shù)據(jù)倉庫試圖提供一種從操作型系統(tǒng)到?jīng)Q策支持環(huán)境的數(shù)據(jù)流架
構(gòu)模型。數(shù)據(jù)倉庫概念的提出,是為了解決和這個數(shù)據(jù)流相關(guān)的各種問題,主要是解決多重數(shù)據(jù)復(fù)制帶來的高成本問題。在沒有數(shù)據(jù)倉庫的時代,需要大量的冗余數(shù)據(jù)來
支撐多個決策支持環(huán)境。在大組織里,多個決策支持環(huán)境獨立運作是典型的情況。盡管每個環(huán)境服務(wù)于不同的用戶,但這些環(huán)境經(jīng)常需要大量相同的數(shù)據(jù)。處理過程收
集、清洗、整合來自多個數(shù)據(jù)源的數(shù)據(jù),并為每個決策支持環(huán)境做部分數(shù)據(jù)復(fù)制。數(shù)據(jù)源通常是早已存在的操作型系統(tǒng),很多是遺留系統(tǒng)。此外,當一個新的決策支持環(huán)
境形成時,操作型系統(tǒng)的數(shù)據(jù)經(jīng)常被再次復(fù)用。用戶訪問這些處理后的數(shù)據(jù)。

1.1.1 數(shù)據(jù)倉庫的定義

數(shù)據(jù)倉庫之父 Bill Inmon 在 1991 年出版的 Building the Data Warehouse 一書中首次提出了被廣為認可的數(shù)據(jù)倉庫定義。 Inmon 將數(shù)據(jù)倉庫描述為一個面向主題的、集成的、
隨時間變化的、非易失的數(shù)據(jù)集合,用于支持管理者的決策過程。這個定義有些復(fù)雜并且難以理解。下面我們將它分解開來進行說明。

  • 面向主題
  • 集成
  • 隨時間變化
  • 非易失

1.1.2 建立數(shù)據(jù)倉庫的原因

  • 某些業(yè)務(wù)數(shù)據(jù)由于安全或其他因素不能直接訪問。
  • 業(yè)務(wù)系統(tǒng)的版本變更很頻繁,每次變更都需要重寫分析系統(tǒng)并重新測試。
  • 很難建立和維護匯總數(shù)據(jù)來源于多個業(yè)務(wù)系統(tǒng)版本的報表。
  • 業(yè)務(wù)系統(tǒng)的列名通常是硬編碼,有時僅僅是無意義的字符串,這讓編寫分析系統(tǒng)更加困難。
  • 業(yè)務(wù)系統(tǒng)的數(shù)據(jù)格式,如日期、數(shù)字的格式不統(tǒng)一。
  • 業(yè)務(wù)系統(tǒng)的表結(jié)構(gòu)為事務(wù)處理性能而優(yōu)化,有時并不適合查詢與分析。
  • 沒有適當?shù)姆绞綄⒂袃r值的數(shù)據(jù)合并進特定應(yīng)用的數(shù)據(jù)庫。
  • 沒有適當?shù)奈恢么鎯υ獢?shù)據(jù)。
  • 用戶需要看到的顯示數(shù)據(jù)字段,有時在數(shù)據(jù)庫中并不存在。
  • 通常事務(wù)處理的優(yōu)先級比分析系統(tǒng)高,所以如果分析系統(tǒng)和事務(wù)處理運行在同一硬件之上,分析系統(tǒng)往往性能很差。
  • 有誤用業(yè)務(wù)數(shù)據(jù)的風(fēng)險。
  • 極有可能影響業(yè)務(wù)系統(tǒng)的性能。

1.1.2 使用數(shù)據(jù)倉庫的好處

  • 將多個數(shù)據(jù)源集成到單一數(shù)據(jù)存儲,因此可以使用單一數(shù)據(jù)查詢引擎展示數(shù)據(jù)。
  • 緩解在事務(wù)處理數(shù)據(jù)庫上因執(zhí)行大查詢而產(chǎn)生的資源競爭問題。
  • 維護歷史數(shù)據(jù)。
  • 通過對多個源系統(tǒng)的數(shù)據(jù)整合,使得在整個企業(yè)的角度存在統(tǒng)一的中心視圖。
  • 通過提供一致的編碼和描述,減少或修正壞數(shù)據(jù)問題,提高數(shù)據(jù)質(zhì)量。
  • 一致性地表示組織信息。
  • 提供所有數(shù)據(jù)的單一通用數(shù)據(jù)模型,而不用關(guān)心數(shù)據(jù)源。
  • 重構(gòu)數(shù)據(jù),使數(shù)據(jù)對業(yè)務(wù)用戶更有意義。
  • 向復(fù)雜分析查詢交付優(yōu)秀的查詢性能,同時不影響操作型系統(tǒng)。
  • 開發(fā)決策型查詢更簡單。

1.2 操作型系統(tǒng)與分析型系統(tǒng)

1.2.1 操作型系統(tǒng)

1.2.1.1 操作型系統(tǒng)的數(shù)據(jù)庫操作

在數(shù)據(jù)庫使用上,操作型系統(tǒng)常用的操作是增、改、查,并且通常是插入與更新密集型的,同時會對數(shù)據(jù)庫進行大量并發(fā)查詢,而刪除操作相對較少。操作型系統(tǒng)一
般都直接在數(shù)據(jù)庫上修改數(shù)據(jù),沒有中間過渡區(qū)。

1.2.1.2 操作型系統(tǒng)的數(shù)據(jù)庫設(shè)計

操作型系統(tǒng)的特征是大量短的事務(wù),并強調(diào)快速處理查詢。每秒事務(wù)數(shù)是操作型系統(tǒng)的一個有效度量指標。針對以上這些特點,數(shù)據(jù)庫設(shè)計一定要滿足系統(tǒng)的要求。
在數(shù)據(jù)庫邏輯設(shè)計上,操作型系統(tǒng)的應(yīng)用數(shù)據(jù)庫大都使用規(guī)范化設(shè)計方法,通常要滿足第三范式。這是因為規(guī)范化設(shè)計能最大限度地數(shù)據(jù)冗余,因而提供更快更高效
的方式執(zhí)行數(shù)據(jù)庫寫操作。關(guān)于規(guī)范化設(shè)計概念及其相關(guān)內(nèi)容,會在第 2 章 “ 數(shù)據(jù)倉庫設(shè)計 ” 中做詳細說明。
在數(shù)據(jù)庫物理設(shè)計上,應(yīng)該依據(jù)系統(tǒng)所使用的數(shù)據(jù)庫管理系統(tǒng)的具體特點,做出相應(yīng)的設(shè)計,畢竟每種數(shù)據(jù)庫管理系統(tǒng)在實現(xiàn)細節(jié)上還是存在很大差異的。下面就以
Oracle 數(shù)據(jù)庫為例,簡要說明在設(shè)計操作型系統(tǒng)數(shù)據(jù)庫時應(yīng)該考慮的問題。

  • 調(diào)整回滾段?;貪L段是數(shù)據(jù)庫的一部分,其中記錄著最終被回滾的事務(wù)的行為。這些回滾段信息可以提供讀一致性、回滾事務(wù)和數(shù)據(jù)庫恢復(fù)。
  • 合理使用聚簇。聚簇是一種數(shù)據(jù)庫模式,其中包含有共用一列或多列的多個表。數(shù)據(jù)庫中的聚簇表用于提高連接操作的性能。
  • 適當調(diào)整數(shù)據(jù)塊大小。數(shù)據(jù)塊大小應(yīng)該是操作系統(tǒng)塊大小的倍數(shù),并且設(shè)置上限以避免不必要的 I/O 。
  • 設(shè)置緩沖區(qū)高速緩存大小。合理的緩存大小能夠有效避免不必要的磁盤 I/O 。
  • 動態(tài)分配表空間。
  • 合理劃分數(shù)據(jù)庫分區(qū)。分區(qū)最大的作用是能在可用性和安全性維護期間保持事務(wù)處理的性能。
  • SQL 優(yōu)化。有效利用數(shù)據(jù)庫管理系統(tǒng)的優(yōu)化器,使用最佳的數(shù)據(jù)訪問路徑。
  • 避免過度使用索引。大量的數(shù)據(jù)修改會給索引維護帶來壓力,從而對整個系統(tǒng)的性能產(chǎn)生負面影響。
    以上所講的操作型系統(tǒng)都是以數(shù)據(jù)庫系統(tǒng)為核心,而數(shù)據(jù)庫系統(tǒng)為了保持 ACID 特性,本質(zhì)上是單一集中式系統(tǒng)。在當今這個信息爆炸的時代,集中式數(shù)據(jù)庫往往已無
    法支撐業(yè)務(wù)的需要(從某訂票網(wǎng)站和某電商網(wǎng)站的超大瞬時并發(fā)量來看,這已是一個不爭的事實)。這就給操作型系統(tǒng)帶來新的挑戰(zhàn)。分布式事務(wù)、去中心化、 CAP 與最
    終一致性等一系列新的理論和技術(shù)為解決系統(tǒng)擴展問題應(yīng)運而生。

1.2.2 分析型系統(tǒng)

在計算機領(lǐng)域,分析型系統(tǒng)是一種快速回答多維分析查詢的實現(xiàn)方式。它也是更廣泛范疇的所謂商業(yè)智能的一部分(商業(yè)智能還包含數(shù)據(jù)庫、報表系統(tǒng)、數(shù)據(jù)挖掘、
數(shù)據(jù)可視化等研究方向)。分析型系統(tǒng)的典型應(yīng)用包括銷售業(yè)務(wù)分析報告、市場管理報告、業(yè)務(wù)過程管理( BPM )、預(yù)算和預(yù)測、金融分析報告及其類似的應(yīng)用。

1.2.2.1 分析型系統(tǒng)的數(shù)據(jù)庫操作

在數(shù)據(jù)庫層面,分析型系統(tǒng)操作被定義成少量的事務(wù),復(fù)雜的查詢,處理歸檔和歷史數(shù)據(jù)。這些數(shù)據(jù)很少被修改,從數(shù)據(jù)庫抽取數(shù)據(jù)是最多的操作,也是識別這種系
統(tǒng)的關(guān)鍵特征。分析型數(shù)據(jù)庫基本上都是讀操作。

1.2.2.2 分析型系統(tǒng)的數(shù)據(jù)庫設(shè)計

分析型系統(tǒng)的特征是相對少量的事務(wù),但查詢通常非常復(fù)雜并且會包含聚合計算,例如今年和去年同時期的數(shù)據(jù)對比、百分比變化趨勢等。分析型數(shù)據(jù)庫中的數(shù)據(jù)一
般來自于一個企業(yè)級數(shù)據(jù)倉庫,是整合過的歷史數(shù)據(jù)。對于分析型系統(tǒng),吞吐量是一個有效的性能度量指標。
在數(shù)據(jù)庫邏輯設(shè)計上,分析型數(shù)據(jù)庫使用多維數(shù)據(jù)模型,通常是設(shè)計成星型模式或雪花模式。關(guān)于多維數(shù)據(jù)模型的概念及其相關(guān)內(nèi)容,會在第 2 章 “ 數(shù)據(jù)倉庫設(shè)計 ” 中做詳細說明。
在數(shù)據(jù)庫物理設(shè)計上,依然以 Oracle 數(shù)據(jù)庫為例,簡要說明在設(shè)計分析型系統(tǒng)數(shù)據(jù)庫時應(yīng)該考慮的一些問題。

  • 表分區(qū)??梢元毩⒍x表分區(qū)的物理存儲屬性,將不同分區(qū)的數(shù)據(jù)存放到多個物理文件上,這樣做一方面可以分散 I/O ;另一方面,當數(shù)據(jù)量非常大時,方便數(shù)據(jù)維護;再有就是利用分區(qū)消除查詢數(shù)據(jù)時,不用掃描整張表,從而提高查詢性能。
  • 位圖索引。當查詢條件中包含低基數(shù)(不同值很少,例如性別)的列,尤其是包含有這些列上的 or 、 and 或 not 這樣的邏輯運算時,或者從有大量行的表中返回大量的行時,應(yīng)考慮位圖索引。
  • 物化視圖。物化視圖物理存儲查詢所定義的數(shù)據(jù),能夠自動增量刷新數(shù)據(jù),并且可以利用查詢重寫特性極大地提高查詢速度,是分析型系統(tǒng)常用的技術(shù)。
  • 并行化操作??梢栽诓樵兇罅繑?shù)據(jù)時執(zhí)行并行化操作,這樣會導(dǎo)致多個服務(wù)器進程為同一個查詢語句工作,使用該查詢可以快速完成,但是會耗費更多的資源。
    隨著數(shù)據(jù)的大量積累和大數(shù)據(jù)時代的到來,人們對于數(shù)據(jù)分析的依賴性越來越強,而分析型系統(tǒng)也隨之越來越顯示出重要性。舉一個簡單的例子,在一家醫(yī)院中,保存有 20 年的非常完整的病人信息。醫(yī)院領(lǐng)導(dǎo)想看到關(guān)于最常見的疾病、成功治愈率、實習(xí)醫(yī)生的實習(xí)天數(shù)等很多相關(guān)數(shù)據(jù)的詳細報告。為了滿足這個需求,應(yīng)用分析型系統(tǒng)查詢醫(yī)院信息數(shù)據(jù)倉庫,并通過復(fù)雜查詢得到結(jié)果,然后將報告提交給領(lǐng)導(dǎo)做進一步分析。

1.2.3 操作型系統(tǒng)和分析型系統(tǒng)對比

操作型系統(tǒng)和分析型系統(tǒng)是兩種不同種類的信息系統(tǒng)。它們都與數(shù)據(jù)庫技術(shù)相關(guān),數(shù)據(jù)庫提供方法支持這兩種系統(tǒng)的功能。操作型系統(tǒng)和分析型系統(tǒng)以完全不同的方
式使用數(shù)據(jù)庫,不僅如此,分析型系統(tǒng)更加注重數(shù)據(jù)分析和報表,而操作型系統(tǒng)的目標是一個伴有大量數(shù)據(jù)改變的事務(wù)優(yōu)化系統(tǒng)。
對于學(xué)習(xí)數(shù)據(jù)科學(xué)及其相關(guān)技術(shù)的讀者,了解這兩種信息處理方式的區(qū)別至關(guān)重要。這也是理解商業(yè)智能、數(shù)據(jù)挖掘、數(shù)據(jù)倉庫、數(shù)據(jù)模型、 ETL 處理和大數(shù)據(jù)等系
統(tǒng)的基礎(chǔ)。


選區(qū)_017.png

1.3 數(shù)據(jù)倉庫架構(gòu)

前面兩個小節(jié)介紹了數(shù)據(jù)倉庫、操作型系統(tǒng)、分析型系統(tǒng)等概念,也指出了分析型系統(tǒng)的數(shù)據(jù)源一般來自數(shù)據(jù)倉庫,而數(shù)據(jù)倉庫的數(shù)據(jù)來自于操作型系統(tǒng)。本小節(jié)從技術(shù)角度討論數(shù)據(jù)倉庫的組成和架構(gòu)。

1.3.1 基本架構(gòu)

“架構(gòu)” 是什么?這個問題從來就沒有一個準確的答案。在軟件行業(yè),一種被普遍接受的架構(gòu)定義是指系統(tǒng)的一個或多個結(jié)構(gòu)。結(jié)構(gòu)中包括軟件的構(gòu)建(構(gòu)建是指軟件的設(shè)計與實現(xiàn)),構(gòu)建的外部可以看到屬性以及它們之間的相互關(guān)系。這里參考此定義,把數(shù)據(jù)倉庫架構(gòu)理解成構(gòu)成數(shù)據(jù)倉庫的組件及其之間的關(guān)系,那么就有了如圖

選區(qū)_018.png

1.3.2 主要數(shù)據(jù)倉庫架構(gòu)

在數(shù)據(jù)倉庫技術(shù)演化過程中,產(chǎn)生了幾種主要的架構(gòu)方法,包括數(shù)據(jù)集市架構(gòu)、 Inmon 企業(yè)信息工廠架構(gòu)、 Kimball 數(shù)據(jù)倉庫架構(gòu)和混合型數(shù)據(jù)倉庫架構(gòu)。

1.3.2.1 數(shù)據(jù)集市架構(gòu)

數(shù)據(jù)集市是按主題域組織的數(shù)據(jù)集合,用于支持部門級的決策。有兩種類型的數(shù)據(jù)集市:獨立數(shù)據(jù)集市和從屬數(shù)據(jù)集市。
獨立數(shù)據(jù)集市集中于部門所關(guān)心的單一主題域,數(shù)據(jù)以部門為基礎(chǔ)部署,無須考慮企業(yè)級別的信息共享與集成。例如,制造部門、人力資源部門和其他部門都各自有他們自己的數(shù)據(jù)集市。獨立數(shù)據(jù)集市從一個主題域或一個部門的多個事務(wù)系統(tǒng)獲取數(shù)據(jù),用以支持特定部門的業(yè)務(wù)分析需要。一個獨立數(shù)據(jù)集市的設(shè)計既可以使用實體關(guān)系模型,也可以使用多維模型。數(shù)據(jù)分析或商業(yè)智能工具直接從數(shù)據(jù)集市查詢數(shù)據(jù),并將查詢結(jié)果顯示給用戶。一個典型的獨立數(shù)據(jù)集市架構(gòu)如圖 1-2 所示。
因為一個部門的業(yè)務(wù)相對于整個企業(yè)要簡單,數(shù)據(jù)量也小得多,所以部門的獨立數(shù)據(jù)集市具有周期短、見效快的特點。如果從企業(yè)整體的視角來觀察這些數(shù)據(jù)集市,
你會看到每個部門使用不同的技術(shù),建立不同的 ETL 的過程,處理不同的事務(wù)系統(tǒng),而在多個獨立的數(shù)據(jù)集市之間還會存在數(shù)據(jù)的交叉與重疊,甚至?xí)袛?shù)據(jù)不一致的情況。從業(yè)務(wù)角度看,當部門的分析需求擴展,或者需要分析跨部門或跨主題域的數(shù)據(jù)時,獨立數(shù)據(jù)市場會顯得力不從心。而當數(shù)據(jù)存在歧義,比如同一個產(chǎn)品,在 A 部門和 B 部門的定義不同時,將無法在部門間進行信息比較。


選區(qū)_019.png

1.3.2.2 Kimball 數(shù)據(jù)倉庫架構(gòu)

選區(qū)_020.png

對比上一張圖可以看到, Kimball 與 Inmon 兩種架構(gòu)的主要區(qū)別在于核心數(shù)據(jù)倉庫的設(shè)計和建立。 Kimball 的數(shù)據(jù)倉庫包含高粒度的企業(yè)數(shù)據(jù),使用多維模型設(shè)計,這也意味著數(shù)據(jù)倉庫由星型模式的維度表和事實表構(gòu)成。分析系統(tǒng)或報表工具可以直接訪問多維數(shù)據(jù)倉庫里的數(shù)據(jù)。在此架構(gòu)中的數(shù)據(jù)集市也與 Inmon 中的不同。這里的數(shù)據(jù)集市是一個邏輯概念,只是多維數(shù)據(jù)倉庫中的主題域劃分,并沒有自己的物理存儲,也可以說是虛擬的數(shù)據(jù)集市。

1.3.2.3 混合型數(shù)據(jù)倉庫架構(gòu)

選區(qū)_021.png

所謂的混合型結(jié)構(gòu),指的是在一個數(shù)據(jù)倉庫環(huán)境中,聯(lián)合使用 Inmon 和 Kimball 兩種架構(gòu)。從架構(gòu)圖可以看到,這種架構(gòu)將 Inmon 方法中的數(shù)據(jù)集市部分替換成了一個多維數(shù)據(jù)倉庫,而數(shù)據(jù)集市則是多維數(shù)據(jù)倉庫上的邏輯視圖。使用這種架構(gòu)的好處是,既可以利用規(guī)范化設(shè)計消除數(shù)據(jù)冗余,保證數(shù)據(jù)的粒度足夠細;又可以利用多維結(jié)構(gòu)更靈活地在企業(yè)級實現(xiàn)報表和分析。

1.3.3 操作數(shù)據(jù)存儲

操作數(shù)據(jù)存儲又稱為 ODS ,是 Operational DataStore 的簡寫,其定義是這樣的:一個面向主題的、集成的、可變的、當前的細節(jié)數(shù)據(jù)集合,用于支持企業(yè)對于即時性的、操作性的、集成的全體信息的需求。對比 1.1 節(jié)中數(shù)據(jù)倉庫的定義不難看出,操作型數(shù)據(jù)存儲在某些方面具有類似于數(shù)據(jù)倉庫的特點,但在另一些方面又顯著不同于數(shù)據(jù)倉庫。

  • 像數(shù)據(jù)倉庫一樣,是面向主題的。
  • 像數(shù)據(jù)倉庫一樣,其數(shù)據(jù)是完全集成的。
  • 數(shù)據(jù)是當前的,這與數(shù)據(jù)倉庫存儲歷史數(shù)據(jù)的性質(zhì)明顯不同。 ODS 具有最少的歷史數(shù)據(jù)(一般是 30 天到 60 ),而盡可能接近實時地展示數(shù)據(jù)的狀態(tài)。
  • 數(shù)據(jù)是可更新的,這是與靜態(tài)數(shù)據(jù)倉庫又一個很大的區(qū)別。 ODS 就如同一個事務(wù)處理系統(tǒng),當新的數(shù)據(jù)流進 ODS 時,受其影響的字段被新信息覆蓋。
  • 數(shù)據(jù)幾乎完全是細節(jié)數(shù)據(jù),僅具有少量的動態(tài)聚集或匯總數(shù)據(jù)。通常將 ODS 設(shè)計成包含事務(wù)級的數(shù)據(jù),即包含該主題域中最低粒度級別的數(shù)據(jù)。
  • 在數(shù)據(jù)倉庫中,幾乎沒有針對其本身的報表,報表均放到數(shù)據(jù)集市中完成;與此不同,在 ODS 中,業(yè)務(wù)用戶頻繁地直接訪問 ODS 。
    在一個數(shù)據(jù)倉庫環(huán)境中, ODS 具有如下幾個作用:
  1. 充當業(yè)務(wù)系統(tǒng)與數(shù)據(jù)倉庫之間的過渡區(qū)。數(shù)據(jù)倉庫的數(shù)據(jù)來源復(fù)雜,可能分布在不同的數(shù)據(jù)庫,不同的地理位置,不同的應(yīng)用系統(tǒng)之中,而且由于數(shù)據(jù)形式的多樣性,數(shù)據(jù)轉(zhuǎn)換的規(guī)則往往極為復(fù)雜。如果直接從業(yè)務(wù)系統(tǒng)抽取數(shù)據(jù)并做轉(zhuǎn)換,不可避免地會對業(yè)務(wù)系統(tǒng)造成影響。而 ODS 中存放的數(shù)據(jù)從數(shù)據(jù)結(jié)構(gòu)、數(shù)據(jù)粒度、數(shù)據(jù)之間的邏輯關(guān)系上都與業(yè)務(wù)系統(tǒng)基本保持一致,因此抽取過程只需簡單的數(shù)據(jù)復(fù)制而基本不再需要做數(shù)據(jù)轉(zhuǎn)換,大大降低了復(fù)雜性,同時最小化對業(yè)務(wù)系統(tǒng)的侵入。
  2. 轉(zhuǎn)移部分業(yè)務(wù)系統(tǒng)細節(jié)查詢的功能。某些原來由業(yè)務(wù)系統(tǒng)產(chǎn)生的報表、細節(jié)數(shù)據(jù)的查詢能夠在 ODS 中進行,從而降低業(yè)務(wù)系統(tǒng)的查詢壓力。
  3. 完成數(shù)據(jù)倉庫中不能完成的一些功能。用戶有時會要求數(shù)據(jù)倉庫查詢最低粒度級別的細節(jié)數(shù)據(jù),而數(shù)據(jù)倉庫中存儲的數(shù)據(jù)一般都是聚合或匯總過的數(shù)據(jù),并不存儲每筆交易產(chǎn)生的細節(jié)數(shù)據(jù)。這時就需要把細節(jié)數(shù)據(jù)查詢的功能轉(zhuǎn)移到 ODS 來完成,而且 ODS 的數(shù)據(jù)模型是按照面向主題的方式組織的,可以方便地支持多維分析。
    即數(shù)據(jù)倉庫從宏觀角度滿足企業(yè)的決策支持要求,而 ODS 層則從微觀角度反映細節(jié)交易數(shù)據(jù)或者低粒度的數(shù)據(jù)查詢要求。

1.4 抽取 - 轉(zhuǎn)換 - 裝載

前面已經(jīng)多次提到了 ETL 一詞,它是 Extract 、 Transform 、 Load 三個英文單詞首字母的簡寫,中文意為抽取、轉(zhuǎn)換、裝載。 ETL 是建立數(shù)據(jù)倉庫最重要的處理過程,也是最體現(xiàn)工作量的環(huán)節(jié),一般會占到整個數(shù)據(jù)倉庫項目工作量的一半以上。

  • 抽取:從操作型數(shù)據(jù)源獲取數(shù)據(jù)。
  • 轉(zhuǎn)換:轉(zhuǎn)換數(shù)據(jù),使之轉(zhuǎn)變?yōu)檫m用于查詢和分析的形式和結(jié)構(gòu)。
  • 裝載:將轉(zhuǎn)換后的數(shù)據(jù)導(dǎo)入到最終的目標數(shù)據(jù)倉庫。
    建立一個數(shù)據(jù)倉庫,就是要把來自于多個異構(gòu)的源系統(tǒng)的數(shù)據(jù)集成在一起,放置于一個集中的位置用于數(shù)據(jù)分析。如果一開始這些源系統(tǒng)數(shù)據(jù)就是兼容的當然最好,但情況往往不是這樣。 ETL 系統(tǒng)的工作就是要把異構(gòu)的數(shù)據(jù)轉(zhuǎn)換成同構(gòu)的。如果沒有 ETL ,不可能對異構(gòu)的數(shù)據(jù)進行程序化的分析。

1.4.1 數(shù)據(jù)抽取

1.4.1.1 邏輯抽取

  • 全量抽取
  • 增量抽取

1.4.1.2 物理抽取

  1. 聯(lián)機抽取
  2. 脫機抽取
    數(shù)據(jù)不從源系統(tǒng)直接抽取,而是從一個源系統(tǒng)以外的過渡區(qū)抽取。過渡區(qū)可能已經(jīng)存在(例如數(shù)據(jù)庫備份文件、關(guān)系數(shù)據(jù)庫系統(tǒng)的重做日志、歸檔日志等),或者抽取程序自己建立。應(yīng)該考慮以下的存儲結(jié)構(gòu):
  • 數(shù)據(jù)庫備份文件。一般需要數(shù)據(jù)還原操作才能使用。
  • 備用數(shù)據(jù)庫。如 Oracle 的 DataGuard 和 MySQL 的數(shù)據(jù)復(fù)制等技術(shù)。
  • 平面文件。數(shù)據(jù)定義成普通格式,關(guān)于源對象的附加信息(列名、數(shù)據(jù)類型等)需要另外處理。
  • 導(dǎo)出文件。關(guān)系數(shù)據(jù)庫大都自帶數(shù)據(jù)導(dǎo)出功能,如 Oracle 的 exp/expdp 程序和 MySQL 的mysqldump 程序,都 可以用于生成導(dǎo)出數(shù)據(jù)文件。
  • 重做日志和歸檔日志。每種數(shù)據(jù)庫系統(tǒng)都有自己的日志格式和解析工具。
  1. 變化數(shù)據(jù)捕獲
    抽取處理需要重點考慮增量抽取,也被稱為變化數(shù)據(jù)捕獲,簡稱 CDC 。假設(shè)一個數(shù)據(jù)倉庫系統(tǒng),在每天夜里的業(yè)務(wù)低峰時間從操作型源系統(tǒng)抽取數(shù)據(jù),那么增量抽取只需要過去 24 小時內(nèi)發(fā)生變化的數(shù)據(jù)。變化數(shù)據(jù)捕獲也是建立準實時數(shù)據(jù)倉庫的關(guān)鍵技術(shù)。
    當你能夠識別并獲得最近發(fā)生變化的數(shù)據(jù)時,抽取及其后面的轉(zhuǎn)換、裝載操作顯然都會變得更高效,因為要處理的數(shù)據(jù)量會小很多。遺憾的是,很多源系統(tǒng)很難識別出最近變化的數(shù)據(jù),或者必須侵入源系統(tǒng)才能做到。變化數(shù)據(jù)捕獲是數(shù)據(jù)抽取中典型的技術(shù)挑戰(zhàn)。
    常用的變化數(shù)據(jù)捕獲方法有時間戳、快照、觸發(fā)器和日志四種。相信熟悉數(shù)據(jù)庫的讀者對這些方法都不會陌生。時間戳方法需要源系統(tǒng)有相應(yīng)的數(shù)據(jù)列表示最后的數(shù)據(jù)變化??煺辗椒梢允褂脭?shù)據(jù)庫系統(tǒng)自帶的機制實現(xiàn),如 Oracle 的物化視圖技術(shù),也可以自己實現(xiàn)相關(guān)邏輯,但會比較復(fù)雜。觸發(fā)器是關(guān)系數(shù)據(jù)庫系統(tǒng)具有的特性,源表上建立的觸發(fā)器會在對該表執(zhí)行 insert 、 update 、 delete 等語句時被觸發(fā),觸發(fā)器中的邏輯用于捕獲數(shù)據(jù)的變化。日志可以使用應(yīng)用日志或系統(tǒng)日志,這種方式對源系統(tǒng)不具有侵入性,但需要額外的日志解析工作。

1.4.2 數(shù)據(jù)轉(zhuǎn)換

數(shù)據(jù)從操作型源系統(tǒng)獲取后,需要進行多種轉(zhuǎn)換操作。如統(tǒng)一數(shù)據(jù)類型、處理拼寫錯誤、消除數(shù)據(jù)歧義、解析為標準格式等。數(shù)據(jù)轉(zhuǎn)換通常是最復(fù)雜的部分,也是ETL 開發(fā)中用時最長的一步。數(shù)據(jù)轉(zhuǎn)換的范圍極廣,從單純的數(shù)據(jù)類型轉(zhuǎn)化到極為復(fù)雜的數(shù)據(jù)清洗技術(shù)。
在數(shù)據(jù)轉(zhuǎn)換階段,為了能夠最終將數(shù)據(jù)裝載到數(shù)據(jù)倉庫中,需要在已經(jīng)抽取來的數(shù)據(jù)上應(yīng)用一系列的規(guī)則和函數(shù)。有些數(shù)據(jù)可能不需要轉(zhuǎn)換就能直接導(dǎo)入到數(shù)據(jù)倉庫。
數(shù)據(jù)轉(zhuǎn)換一個最重要的功能是清洗數(shù)據(jù),目的是只有 “ 合規(guī) ” 的數(shù)據(jù)才能進入目標數(shù)據(jù)倉庫。這步操作在不同系統(tǒng)間交互和通信時尤其必要,例如,一個系統(tǒng)的字符集在另一個系統(tǒng)中可能是無效的。另一方面,由于某些業(yè)務(wù)和技術(shù)的需要,也需要進行多種數(shù)據(jù)轉(zhuǎn)換,例如下面的情況:

  • 只裝載特定的數(shù)據(jù)列。例如,某列為空的數(shù)據(jù)不裝載。
  • 統(tǒng)一數(shù)據(jù)編碼。例如,性別字段,有些系統(tǒng)使用的是 1 和 0 ,有些是 ‘M’ 和 ‘F’ ,有些是 ‘ 男 ’ 和 ‘ 女 ’ ,統(tǒng)一成 ‘M’ 和 ‘F’ 。
  • 自由值編碼。例如,將 ‘Male’ 改成 ‘M’ 。
  • 預(yù)計算。例如,產(chǎn)品單價 * 購買數(shù)量=金額。
  • 基于某些規(guī)則重新排序以提高查詢性能。
  • 合并多個數(shù)據(jù)源的數(shù)據(jù)并去重。
  • 預(yù)聚合。例如,匯總銷售數(shù)據(jù)。
  • 行列轉(zhuǎn)置。
  • 將一列轉(zhuǎn)為多列。例如,某列存儲的數(shù)據(jù)是以逗號作為分隔符的字符串,將其分割成多列的單個值。
  • 合并重復(fù)列。
  • 預(yù)連接。例如,查詢多個關(guān)聯(lián)表的數(shù)據(jù)。
  • 數(shù)據(jù)驗證。針對驗證的結(jié)果采取不同的處理,通過驗證的數(shù)據(jù)交給裝載步驟,驗證失敗的數(shù)據(jù)或直接丟棄,或記錄下來做進一步檢查。

1.4.3 數(shù)據(jù)裝載

ETL 的最后步驟是把轉(zhuǎn)換后的數(shù)據(jù)裝載進目標數(shù)據(jù)倉庫。這步操作需要重點考慮兩個問題,一是數(shù)據(jù)裝載的效率問題,二是一旦裝載過程中途失敗了,如何再次重復(fù)執(zhí)行裝載過程。
即使經(jīng)過了轉(zhuǎn)換、過濾和清洗,去掉了部分噪聲數(shù)據(jù),但需要裝載的數(shù)據(jù)量還是很大的。執(zhí)行一次數(shù)據(jù)裝載可能需要幾個小時的時間,同時需要占用大量的系統(tǒng)資源。要提高裝載的效率,加快裝載速度,可以從以下幾方面入手。首先保證足夠的系統(tǒng)資源。數(shù)據(jù)倉庫存儲的都是海量數(shù)據(jù),所以要配置高性能的服務(wù)器,并且要獨占資源,不要與別的系統(tǒng)共用。在進行數(shù)據(jù)裝載時,要禁用數(shù)據(jù)庫約束(唯一性、非空性,檢查約束等)和索引,當裝載過程完全結(jié)束后,再啟用這些約束,重建索引,這種方法會很大的提高裝載速度。在數(shù)據(jù)倉庫環(huán)境中,一般不使用數(shù)據(jù)庫來保證數(shù)據(jù)的參考完整性,即不使用數(shù)據(jù)庫的外鍵約束,它應(yīng)該由 ETL 工具或程序來維護。
數(shù)據(jù)裝載過程可能由于多種原因而失敗,比如裝載過程中某些源表和目標表的結(jié)構(gòu)不一致而導(dǎo)致失敗,而這時已經(jīng)有部分表裝載成功了。在數(shù)據(jù)量很大的情況下,如何能在重新執(zhí)行裝載過程時只裝載失敗的部分是一個不小的挑戰(zhàn)。對于這種情況,實現(xiàn)可重復(fù)裝載的關(guān)鍵是要記錄下失敗點,并在裝載程序中處理相關(guān)的邏輯。還有一種情況,就是裝載成功后,數(shù)據(jù)又發(fā)生了改變(比如有些滯后的數(shù)據(jù)在 ETL 執(zhí)行完才進入系統(tǒng),就會帶來數(shù)據(jù)的更新或新增),這時需要重新再執(zhí)行一遍裝載過程,已經(jīng)正確裝載的數(shù)據(jù)可以被覆蓋,但相同數(shù)據(jù)不能重復(fù)新增。簡單的實現(xiàn)方式是先刪除再插入,或者用 replace into 、 merge into 等類似功能的操作。
裝載到數(shù)據(jù)倉庫里的數(shù)據(jù),經(jīng)過匯總、聚合等處理后交付給多維立方體或數(shù)據(jù)可視化、儀表盤等報表工具、 BI 工具做進一步的數(shù)據(jù)分析。

1.4.4 開發(fā) ETL 系統(tǒng)的方法

ETL 系統(tǒng)一般都會從多個應(yīng)用系統(tǒng)整合數(shù)據(jù),典型的情況是這些應(yīng)用系統(tǒng)運行在不同的軟硬件平臺上,由不同的廠商所支持,各個系統(tǒng)的開發(fā)團隊也是彼此獨立的,隨之而來的數(shù)據(jù)多樣性增加了 ETL 系統(tǒng)的復(fù)雜性。
開發(fā)一個 ETL 系統(tǒng),常用的方式是使用數(shù)據(jù)庫標準的 SQL 及其程序化語言,如 Oracle 的 PL/SQL 和 MySQL 的存儲過程、用戶自定義函數(shù)( UDF )等。還可以使用 Kettle 這樣的 ETL 工具,這些工具都提供多種數(shù)據(jù)庫連接器和多種文件格式的處理能力,并且對 ETL 處理進行了優(yōu)化。使用工具的最大好處是減少編程工作量,提高工作效率。如果遇到特殊需求或特別復(fù)雜的情況,可能還是需要使用 Shell 、 Java 、 Python 等編程語言開發(fā)自己的應(yīng)用程序。
ETL 過程要面對大量的數(shù)據(jù),因此需要較長的處理時間。為了提高ETL的效率,通常這三步操作會并行執(zhí)行。當數(shù)據(jù)被抽取時,轉(zhuǎn)換進程同時處理已經(jīng)收到的數(shù)據(jù)。一旦某些數(shù)據(jù)被轉(zhuǎn)換過程處理完,裝載進程就會將這些數(shù)據(jù)導(dǎo)入目標數(shù)據(jù)倉庫,而不會等到前一步工作執(zhí)行完才開始。

1.4.5 常見 ETL 工具

傳統(tǒng)大的軟件廠商一般都提供 ETL 工具軟件,如 Oracle 的 OWB 和 ODI 、微軟的 SQL Server Integration Services 、 SAP 的 Data Integrator 、 IBM 的 InfoSphere DataStage 、
Informatica 等。這里簡單介紹另外一種開源的 ETL 工具 ——Kettle 。
Kettle 是 Pentaho 公司的數(shù)據(jù)整合產(chǎn)品,它可能是現(xiàn)在世界上最流行的開源 ETL 工具,經(jīng)常被用于數(shù)據(jù)倉庫環(huán)境。 Kettle 的使用場景包括:在應(yīng)用或數(shù)據(jù)庫間遷移數(shù)據(jù)、把數(shù)據(jù)庫中的數(shù)據(jù)導(dǎo)出成平面文件、向數(shù)據(jù)庫大批量導(dǎo)入數(shù)據(jù)、數(shù)據(jù)轉(zhuǎn)換和清洗、應(yīng)用整合等。
Kettle 里主要有 “ 轉(zhuǎn)換 ” 和 “ 作業(yè) ” 兩個功能模塊。轉(zhuǎn)換是 ETL 解決方案中最主要的部分,它處理 ETL 各階段各種對數(shù)據(jù)的操作。轉(zhuǎn)換有輸入、輸出、檢驗、映射、加密、腳本等很多分類,每個分類中包括多個步驟,如輸入轉(zhuǎn)換中就有表輸入、 CSV 文件輸入、文本文件輸入等很多步驟。轉(zhuǎn)換里的步驟通過跳( hop )來連接,跳定義了一個單向通道,允許數(shù)據(jù)從一個步驟流向另外一個步驟。在 Kettle 里,數(shù)據(jù)的單位是行,數(shù)據(jù)流就是數(shù)據(jù)行從一個步驟到另一個步驟的移動。
轉(zhuǎn)換是以并行方式執(zhí)行的,而作業(yè)則是以串行方式處理的,驗證數(shù)據(jù)表是否存在這樣的操作就需要作業(yè)來完成。一個作業(yè)包括一個或多個作業(yè)項,作業(yè)項是以某種順序來執(zhí)行的,作業(yè)執(zhí)行順序由作業(yè)項之間的跳( hop )和每個作業(yè)項的執(zhí)行結(jié)果決定。和轉(zhuǎn)換一樣,作業(yè)也有很多分類,每個分類中包括多個作業(yè)項,如轉(zhuǎn)換就是一個通用分類里的作業(yè)項。作業(yè)項也可以是一個作業(yè),此時稱該作業(yè)為子作業(yè)。
Kettle 非常容易使用,其所有的功能都通過用戶界面完成,不需要任何編碼工作。你只需要告訴它做什么,而不用指示它怎么做,這大大提高了 ETL 過程的開發(fā)效率。

1.5 數(shù)據(jù)倉庫需求

1.5.1 基本需求

  • 安全性
  • 可訪問性
  • 自動化

1.5.2 數(shù)據(jù)需求

  1. 準確性
    想要數(shù)據(jù)倉庫實施成功,業(yè)務(wù)用戶必須信任其中的數(shù)據(jù)。這就意味著他們應(yīng)該能知道數(shù)據(jù)從哪來,何時抽取,怎么轉(zhuǎn)換的。更重要的是,他們需要訪問原始數(shù)據(jù)來確
    定如何解決數(shù)據(jù)差異問題。實際上 ETL 過程應(yīng)該總是在數(shù)據(jù)倉庫的某個地方(如 ODS )保留一份原始數(shù)據(jù)的復(fù)制。
  2. 時效性
    用戶的時效性要求差異很大。有些用戶需要數(shù)據(jù)精確到毫秒級,而有些用戶只需要幾分鐘、幾小時甚至幾天前的數(shù)據(jù)就可以了。數(shù)據(jù)倉庫是分析型系統(tǒng),用于決策支
    持,所以實踐中一般不需要很強的實時性,以一天作為時間粒度是比較常見的。
  3. 歷史可追溯性
    數(shù)據(jù)倉庫更多的價值體現(xiàn)在它能夠輔助隨時間變化的趨勢分析,并幫助理解業(yè)務(wù)事件(如特殊節(jié)日促銷等)與經(jīng)營績效之間的關(guān)系。

1.6 小結(jié)

  • 數(shù)據(jù)倉庫是一個面向主題的、集成的、隨時間變化的、非易失的數(shù)據(jù)集合,用于支持管理者的決策過程。
  • 數(shù)據(jù)倉庫中的粒度是指數(shù)據(jù)的細節(jié)或匯總程度,細節(jié)程度越高,粒度級別越低。
  • 數(shù)據(jù)倉庫的數(shù)據(jù)來自各個業(yè)務(wù)應(yīng)用系統(tǒng)。
  • 很多因素導(dǎo)致直接訪問業(yè)務(wù)系統(tǒng)無法進行全局數(shù)據(jù)分析的工作,這也是需要一個數(shù)據(jù)倉庫的原因所在。
  • 操作型系統(tǒng)是一類專門用于管理面向事務(wù)的應(yīng)用信息系統(tǒng),而分析型系統(tǒng)是一種快速回答多維分析查詢的實現(xiàn)方式,兩者在很多方面存在差異。
  • 構(gòu)成數(shù)據(jù)倉庫系統(tǒng)的主要組成部分有數(shù)據(jù)源、 ODS 、中心數(shù)據(jù)倉庫、分析查詢引擎、 ETL 、元數(shù)據(jù)管理和自動化調(diào)度。
  • 主要的數(shù)據(jù)倉庫架構(gòu)有獨立數(shù)據(jù)集市、從屬數(shù)據(jù)集市、 Inmon 企業(yè)信息工廠、 Kimball 多維數(shù)據(jù)倉庫、混合型數(shù)據(jù)倉庫。
  • ETL 是建立數(shù)據(jù)倉庫最重要的處理過程,也是最體現(xiàn)工作量的環(huán)節(jié)。
  • Kettle 是常用的開源 ETL 工具。
  • 數(shù)據(jù)倉庫的基本需求是安全性、可訪問性、自動化,對數(shù)據(jù)的要求是準確性、時效性、歷史可追溯性。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容