亚洲成精品动漫久久精久,九九在线精品视频播放,黄色成人免费观看,三级成人影院,久碰久,四虎成人欧美精品在永久在线

掃一掃
關注微信公眾號

關于構建數據倉庫的幾個問題
2021-03-04   大數據技術與數倉


  本文轉載自微信公眾號「大數據技術與數倉」,作者西貝。轉載本文請聯系大數據技術與數倉公眾號。
 
  寫在前面
 
  數據倉庫(DataWarehouse)是一個面向主題的(SubjectOriented)、集成的(Integrated)、相對穩定的(Non-Volatile)、反映歷史變化(TimeVariant)的數據集合,用于支持管理決策(DecisionMakingSupport)。近年來,隨著大數據的應用不斷深入,構建企業級數據倉庫成為了企業進行精細化運營的一種趨勢。
 
  從管理者的視角來看,數據倉庫是賦能業務并輔助決策的一種工具,從開發者的視角來看,數據倉庫是一堆數據模型的集合。數倉開發是一個系統工程,涉及數據集成、數據建模、數據開發、數據服務、任務調度、元數據管理、數據質量管理(DQC)等一系列的流程。另外,由于數據跟業務是息息相關的,所以在構建數倉的時候,需要對業務有一個非常深刻的理解。
 
  值得注意的是,數倉的建設不是一蹴而就的,也沒有畢其功于一役的方法,業務的不斷變化決定了數倉是在不斷迭代中進行完善的。從這個層面上來講,或許永遠沒有完美的數倉。由于人員的流動、業務的變化以及前期的系統性建設不足,數倉總會存在這樣或那樣的問題。
 
  或許我們可以用"是否成熟"描述數倉的建設,那么什么是成熟的數倉呢,我們不妨換個角度思考一下:什么是一個不成熟的數據倉庫?此時你的腦海里是否會蹦出一個詞,那就是混亂。是的,一個不成熟的數倉雖然具備了部分數倉規范,但在具體的落地實施過程中,并未能完全按照規范操作,導致數據倉庫建設比較混亂,比如數據域劃分不清楚、數倉分層不明確、數據任務隨意依賴、數據重復開發等等問題。迫于業務快速變化以及日常數據開發需求的壓力,造成了數據開發沒有太多的時間和精力去顧及這些問題,最終形成了一個不成熟的數倉。一旦出現了這些問題,后續就需要有專門的數據治理團隊去規劃并規范數倉的建設。
 
  所以,假設你接手了一個不成熟的數倉項目,或者你覺得目前的數倉建設還不夠成熟,那么不妨思考一下幾個問題:
 
  定目標
 
  選技術
 
  找問題
 
  劃主題
 
  識分層
 
  理建模
 
  制規范
 
  定目標數倉設計目標包括數倉分層清晰,字段與模型命名規范,具備較高可復用性與可維護性,能夠快速響應產品運營層面的數據分析需求,以數據驅動產品迭代與業務增長。
 
  數倉設計的過程中,堅持用戶驅動與數據驅動相結合的設計理念,即一方面根據當前的業務數據的基礎和質量情況,以數據源分析為出發點構建數據倉庫;另一方面根據業務的方向性需求,從業務需要解決的具體問題出發,確定系統范圍和需求框架。
 
  選技術
 
  數據倉庫是一個復雜系統,會涉及到一系列的流程,由此不可避免的會使用很多的技術框架。目前,行業中使用的常見工具主要包括:數據同步工具、數據處理工具、任務調度工具、報表工具、元數據管理工具、質量管理平臺(DQC)以及大數據基礎平臺等等。
 
  如果是自建的大數據平臺,或者是沒有一個大數據開發平臺,這種情況下需要數倉開發人員具備豐富的技術棧,既要兼顧技術的集成使用,又要兼顧數倉的建設與業務需求的開發。如果使用的是已經集成好的開發套件,比如阿里云的dataworks,這樣數倉的開發人員會更加聚焦數倉的建設,而不是在各種技術的集成過程中踩坑而分散過多的精力。
 
  找問題
 
  前文已經提到沒有完美的數倉,其實數倉的建設并沒有對與錯之分,只有好與壞之差。我們不能一味的使用拿來主義的方式去構建數據倉庫,數據倉庫建設能否成功會涉及很多的因素,數倉建設的方法論是指引我們的一個方向,萬萬不可迷失其中。一言以蔽之,合適就好。
 
  在接手不成熟的數倉時,需要梳理存在的一些問題,而這些問題一般情況下都大同小異,常見的一些問題主要包括:
 
  數倉分層不清晰
 
  數據域劃分不明確
 
  模型設計不合理
 
  代碼不規范
 
  命名不統一
 
  劃主題
 
  主題域是業務過程的抽象集合,是在較高層次上對數據進行分類聚集的抽象,這是一個邏輯概念,主要方便數據的分類管理。業務過程就是企業經營過程中一個個不可拆分的行為事件,比如倉儲管理里面有入庫、出庫、發貨、簽收,都是業務過程,抽象出來的主題域就是倉儲域。主題域劃分要盡量涵蓋所有業務需求,保持相對穩定性,還具備一定的擴展性,新加入一個主題域,不影響已經劃分的主題域的表。有了主題域之后,每個數據模型也就有了一個歸屬,這樣數據組織會更加的清晰,同時也比較方便維護。
 
  識分層
 
  數倉為什么要分層
 
  合理的數據倉庫分層一方面能夠降低耦合性,提高重用性,可讀性可維護性,另一方面也能提高運算的效率,影響到數據需求迭代的速度,近而影響到產品決策的及時性。建立數據分層可以提煉公共層,避免煙囪式開發,可見一個合適且合理的數倉分層是極其重要。
 
  通用分層設計思路
 
  ODS:操作型數據(OperationalDataStore),指結構與源系統基本保持一致的增量或者全量數據。作為DW數據的一個數據準備區,同時又承擔基礎數據記錄歷史變化,之所以保留原始數據和線上原始數據保持一致,方便后期數據核對需要。
 
  CDM:通用數據模型,又稱為數據中間層(CommonDataModel),包含DWD、DWS、DIM層。
 
  DWD:數據倉庫明細層數據(DataWarehouseDetail)。對ODS層數據進行清洗轉化,以業務過程作為建模驅動,基于每個具體的業務過程特點,構建最細粒度的明細事實表。可以結合企業的數據使用特點,基于維度建模思想,將明細事實表的某些重要屬性字段做適當冗余,也即寬表化處理,構建明細寬表。
 
  DWS:數據倉庫匯總層數據(DataWarehouseSummary),基于指標需求,構建初步匯總事實表,一般是寬表。基于上層的應用和產品的指標需求,構建公共粒度的匯總指標表。以寬表化手段物理化模型,構建命名規范、口徑一致的統計指標,為上層提供公共指標。
 
  DIM:建立一致數據分析維表,可以降低數據計算口徑不統一的風險,同時可以方便進行交叉探查。以維度作為建模驅動,基于每個維度的業務含義,通過添加維度屬性、關聯維度等定義計算邏輯,完成屬性定義的過程并建立一致的數據分析維表。
 
  ADS:面向應用的數據服務層(ApplicationDataService)。整合匯總成分析某一個主題域的服務數據,面向應用邏輯的數據加工。該層主要存放數據產品個性化的統計指標數據,這一層的數據直接對接數據的消費者,是產品、運營等角色可以直接感知理解的一層,大多數這一層的表都可以直接在BI上通過圖表的形式直接透出。
 
  分層辨析
 
  ODS層
 
  ODS層的概念主要體現在兩個方面:
 
  操作型系統的集成,用于當前、歷史以及其它細節查詢(業務系統的一部分)
 
  為決策支持提供當前細節數據(數據倉庫的一部分)
 
  ODS是用于支持企業日常的全局應用的數據集合,ODS的數據具有面向主題、集成的、可變的以及數據是當前的或是接近當前的特點。同樣也可以看出ODS是介于DB和DW之間的一種過渡存儲。
 
  值得注意的是,Kimball所說的ODS是物理落地關系型數據庫中,但是在實際生產應用中,ODS往往是物理落地在數據倉庫中,比如Hive。
 
  通常來說ODS是在數據倉庫中存儲業務系統源數據,所以從數據粒度、數據結構、數據關系等各個方面都與業務系統的數據源保持一致。但是,也不能僅僅將ODS層看做是業務系統數據源的一個簡單備份,ODS和業務系統數據源的差異主要是由于兩者之間面向業務需求是不同的,業務系統是面向多并發讀寫同時有需要滿足數據的一致性,而ODS數據通常是面向數據報表等批量數據查詢需求。
 
  關于ODS層與業務系統DB的主要區別,體現在一下幾個方面:
 
  數據存儲方式方面。由于性能壓力,業務DB需要對同一個邏輯表進行分表分庫操作,而ODS會將業務系統中同一個邏輯表統一到一個物理實體中存儲
 
  數據存儲介質方面。業務系統通常用oralce、MySQL、DB2等以事務性處理見長關系型數據庫系統,ODS通常存儲在以Hadoop為代表的分布式系統中,比如Hive等等。
 
  數據組織形式方面。業務系統表通常需要遵循三范式,并且需要創建復雜的索引結構來提升查詢效率,但是ODS層的表通常沒有索引。
 
  ODS層的數據同步通常會使用數據庫直連抽取或者數據庫日志抽取的方式,在設計ODS物理表時,在表命名、數據存儲等方面都需要遵循一定的準則。比如:不管是表命名還是字段命名盡量和業務系統保持一致,但是需要通過額外的標識來區分增量和全量表,”_delta”來標識該表為增量表。另外,為了滿足歷史數據分析需求,我們需要在ODS表中加一個時間維度,這個維度通常在ODS表中作為分區字段。如果是增量存儲,則可以按天為單位使用業務日期作為分區,每個分區存放日增量的業務數據。如果是全量存儲,只可以按天為單位使用業務日期作為分區,每個分區存儲截止到當前業務時間的全量快照數據。
 
  DWD層
 
  DWD層的數據一般存放明細事實表,為了提升訪問便利性和訪問性能,在維度模型的事實表基礎上,將部分常用維度冗余到事實表,從而形成寬表模型。
 
  明細事實表的設計有五個步驟:選擇業務過程--->確定粒度--->選擇維度--->確定事實(度量)--->冗余維度。
 
  DWS層
 
  以分析的主題對象作為建模驅動,基于上層的應用和產品的指標需求,構建公共粒度的匯總指標表。以寬表化手段物理化模型,構建命名規范、口徑一致的統計指標,為上層提供公共指標,建立匯總寬表。如:形成日,周,月粒度匯總明細,或者基于某一個維度,如商品類目粒度的匯總日表,統計便于下一步報表數據結構的組織。
 
  關于匯總層的表建模應遵循以下的原則:
 
  數據公用性比如,匯總的聚集表能否與他人公用?基于某個維度的聚集是否是數據分析或者報表中經常使用的?如果滿足這些情況,我們就有必要把明細數據沉淀到匯總表中。
 
  不跨數據域數據域是在較高層次上對數據進行分類聚集的抽象,如交易統一劃到交易域下,商品的新增、修改放到商品域下。
 
  區分統計周期表命名上要能說明數據的統計周期,如_1d表示最近1天,_td截止到當天,_nd表示最近N天。
 
  避免多個層級的數據應該避免將不同層級的數據放在一起,比如,如果存在7天和30天的事實,我們可以選擇用兩列存放7天和30天的事實,但是需要在列名和字段注釋上說明清楚。同時我們也可以使用兩張表分別存儲不同統計周期的數據加以區分。
 
  聚集是不跨越事實的聚集是針對原始星型模型進行的匯總,為了獲取和查詢原始模型一致的結果,聚集的維度和度量必須與原始模型保持一致,因此聚集是不跨事實的。橫向鉆取(交叉探查)是針對多個事實基于一致性維度進行的分析,很多時候采用融合事實表,預先存放橫向鉆取的結果,從而提高查詢性能。因此融合事實表是一種導出模式而不是聚集。
 
  DIM層
 
  該層主要存儲一致性維度數據,數據倉庫總線架構重要基石之一就是一致性維度。通過構建一致性維度我們可以輕松實現數據的交叉探查。
 
  維度是維度建模的基礎和靈魂。維度建模中,將度量稱為“事實”,將環境描述為“維度”,維度是用于分析事實所需要的多樣環境。例如,在分析交易過程時,可以通過買家、賣家、商品和時間等維度描述交易發生的環境。維度所包含的表示維度的列,稱為維度屬性。維度屬性是查詢約束條件、分組和報表標簽生成的基本來源,是數據易用性的關鍵。
 
  ADS層
 
  個性化指標加工,主要存儲不具有公用性的復雜指標,比如針對某張數據報表設計的底層數據存儲模型。
 
  分層注意點
 
  ODS不可以被應用層調用
 
  CDM層任務的深度不宜過大
 
  DWS優先調用DWD及DIM
 
  避免ADS過渡引用明細層
 
  理建模前文介紹了數據分層的概念,而數據建模更多的著眼于數據公共層處理。
 
  好的數據建模有哪些特點
 
  數據模型就是數據組織和存儲方法,強調從業務、數據存儲和數據使用角度合理存儲數據。好的數據建模一般具備如下特點:
 
  性能:能夠幫助使用者快速查詢所需要的數據,減少數據的I/O吞吐,提高使用數據的效率。
 
  成本:減少不必要的數據冗余與重復計算,實現計算結果的良好復用,從而降低存儲和計算成本。
 
  質量:減少數據統計口徑不一致性,減少數據計算錯誤的可能性。
 
  數據模型設計原則
 
  高內聚和低耦合一個邏輯和物理模型由哪些記錄和字段組成,應該遵循最基本的軟件設計方法論的高內聚和低耦合原則。主要從數據業務特性和訪問特性兩個角度來考慮:將業務相近或者相關的數據、粒度相同數據設計為一個邏輯或者物理模型;將高概率同時訪問的數據放一起,將低概率同時訪問的數據分開存儲。
 
  核心模型與擴展模型分離建立核心模型與擴展模型體系,核心模型包括的字段支持常用核心的業務,擴展模型包括的字段支持個性化或是少量應用的需要,不能讓擴展字段過度侵入核心模型,破壞了核心模型的架構簡潔性與可維護性。
 
  公共處理邏輯下沉及單一越是底層公用的處理邏輯更應該在數據調度依賴的底層進行封裝與實現,不要讓公共的處理邏輯暴露給應用層實現,不要讓公共邏輯在多處同時存在。
 
  成本與性能平衡適當的數據冗余換取查詢和刷新性能,不宜過度冗余與數據復制。
 
  數據可回滾處理邏輯不變,在不同時間多次運行數據結果確定不變。
 
  一致性相同的字段含義在不同表中字段命名必須相同,必須使用規范定義中的名稱。
 
  命名清晰可理解表命名需清晰、一致,表名需易于消費者理解和使用。
 
  典型的數據倉庫建模方法
 
  數倉建模的典型方法有:實體建模(ER模型)、維度建模法、DataVault模型、Anchor模型。目前使用較多的當屬維度建模,而維度建模中,又分為星型模型和雪花模型兩大類,一般星型模型使用較多。
 
  星型模型:維度建模非常直觀,緊緊圍繞著業務模型,可以直觀的反映出業務模型中的業務問題。不需要經過復雜的表關聯,就能夠拿到業務分析想要的全部數據,能夠極大的提升數據倉庫的處理能力,缺點則是數據冗余較多。
 
  雪花模型:在星型的基礎上,分解維度,雪花模型的維度表可以擁有其他維度表的,雖然這種模型相比星型模型更規范一些,但是由于這種模型不太容易理解,維護成本比較高,而且性能方面需要關聯多層維表,性能也比星型模型要低,普遍用的少一些。
 
  關于維度建模,主要是將數據分為了維表和事實表。維度建模中,將度量稱為“事實”,將環境描述為“維度”,維度是用于分析事實所需要的多樣環境。例如,在分析交易過程時,可以通過買家、賣家、商品和時間等維度描述交易發生的環境。維度所包含的表示維度的列,稱為維度屬性。維度屬性是查詢約束條件、分組和報表標簽生成的基本來源,是數據易用性的關鍵。
 
  事實表
 
  事實表作為數據倉庫維度建模的核心,緊緊圍繞著業務過程來設計,通過獲取描述業務過程的度量來表達業務過程,包含了引用的維度和與業務過程有關的度量。事實表中一條記錄所表達的業務細節程度被稱為粒度。粒度通常可以通過兩種方式來表述:一種是維度屬性組合所表示的細節程度,一種是所表示的具體業務含義。
 
  相對維度表來說,通常事實表要細長的多,行的增加速度也比維度表快很多。維度屬性也可以存儲到事實表中,這種存儲到事實表中的維度列被稱為退化維度。與其他存儲在維度表中的維度一樣,退化維度也可以用來作為事實表的過濾查詢、實現聚合操作等。
 
  事實表有三種類型:事務事實表、周期快照事實表、累積快照事實表。
 
  維表
 
  注意問題
 
  盡可能包含豐富的維度屬性豐富的維度屬性可以為數據分析統計提供更多的分析角度
 
  編碼與文字描述共存盡可能多給出包括一些富有意義的文字性描述,除此之外,為了保持擴展性,需要將編碼code與文字描述同時保留,方便以后新增加屬性時導致錯誤的計算。比如商品維度中的商品ID和商品標題,類目ID和類目名稱等。ID一般用于不同表之前的關聯,而名稱一般用于報表標簽。
 
  區分數值型的維度屬性數值型字段是作為事實還是維度屬性,取決于該字段的作用。如果通常是用于查詢約束條件或分組統計,則是作為維度屬性;如果通常是用于參與度量的計算,則是作為事實。比如商品價格,可以用于查詢約束條件或統計價格區間的商品數量,此時是作為維度屬性使用;也可以用于統計某類目下商品的平均價格,此時是作為事實使用。
 
  盡量沉淀出通用的維度屬性有些維度屬性獲取需要進行比較復雜的邏輯處理,有需要通過多表關聯得到,也有單表的不同字段混合處理得到,或者對單表的某個字段進行解析得到。此時,需要將盡可能多的通用的維度屬性進行沉淀。一方面,可以提高下游使用的方便性,減少復雜度;另一方面,避免下游使用解析時由于各自邏輯不同而導致的口徑不一致。比如有些字段存儲在JSON字符串中,則需要解析出來。再比如有時候無法直接獲取某個維度屬性,這個時候就需要進行加工判斷,將其作為一個單獨的屬性字段。
 
  維度表一般是很不規范化的。實際應用中,幾乎總是使用維度表的空間來換取簡明性和查詢性能。
 
  緩慢變化維
 
  數據倉庫的重要特點之一是反應歷史變化,所以如何處理維度的變化是維度設計的重要工作之一。緩慢變化維的提出是因為在現實世界中,維度的屬性并不是靜態的,它會隨著時間的變化而發生緩慢的變化,這一現象稱為緩慢變化的維度,簡稱緩慢變化維。與數據增長較為快速的事實表相比,維度變化相對緩慢。
 
  在Kimball的理論中,有三種緩慢變化的處理方式,分別是:
 
  type1:重寫維度值。采用此種方式,不保留歷史,始終取最新數據。
 
  type2:插入新的維度行。采用此種方式,保留歷史,維度值變化前的事實和過去的維度值關聯,維度值變化后的事實和當前的維度值關聯。
 
  type3:添加維度列
 
  在Kimball的理論中,必須使用代理鍵作為每個維度表的主鍵,用于處理緩慢變化維度,這種方式在實際的操作中非常復雜,使用起來也不方便,所以一般情況下不使用代理鍵。
 
  常用緩慢變化維的處理方式
 
  常見的方式是使用快照來處理緩慢變化維。離線數倉按T+1計算,處理維度變化的方式就是每天一份全量快照。比如商品維度,每天保留一份全量商品快照數據。任意一天的事實均可以取到當天的商品信息,也可以取到最新的商品信息,通過限定日期,采用自然鍵進行關聯即可。
 
  此方式的優勢是簡單而有效,開發和維護成本低,另外使用方便,理解性好。數據使用方只需要限定日期即可取到當天的快照數據。任意一天的事實快照和任意一天的維度快照通過維度的自然鍵進行關聯即可。主要的缺點就是會造成存儲資源的浪費,由于存儲成本遠低于CPU、內存等成本,此方法總體來說弊大于利。
 
  制規范
 
  達成共識
 
  對于數倉開發規范,務必要執行到位,確保大家能夠達成一致的理解與認可。只有按照規范操作,才不至于使數倉最終變得越來越臃腫,越來越低效。關于規范的制定,需要經過團隊人員的一致認可,具有可操作性,切不可畏手畏腳地被規范束縛,影響開發效率。
 
  表命名規范
 
  ODS層表命名規范比如全量表:ods.s{源系統表名}比如增量表:ods.s{源系統表名}_delta
 
  DIM/DWD層表命名規范比如全量表:dwd_{數據域縮寫}{自定義表命名}df比如增量表:dwd{數據域縮寫}{自定義表命名}_di比如維表:dim[{業務域縮寫}]{自定義表命名}
 
  DWS層表命名規范dws_{數據域縮寫}{維度縮寫}{自定義表命名}{數字}_{d/m/y,分別表示天、月、年}
 
  最近一天1d最近N天(N)d---N代表是一個數字最近30天1m最近7天1w最近365天1y周累計至今wtd----周報周(周六至周五)月初累計至今mtd累計至今td
 
  ADS層表命名比如:ads_{數據域}{統計粒度}[{業務限定}][{自定義命名標簽}]{統計周期}
 
  關于表的命名需要根據具體團隊的約定,一般見名知意即可,一旦規定了具體的格式,就盡量統一風格
 
  開發規范
 
  編碼規范
 
  SQL注釋
 
  總結
 
  本文主要介紹了構建數倉的過程中或者在接手一個不成熟的數倉之后需要注意的一些問題,主要包括7個方面,分別是定目標、選技術、找問題、劃主題、識分層、理建模、制規范。這些方面只是數倉構建中的一部分,由于篇幅限制,不能一一詳述,希望本文對你有所幫助。

熱詞搜索:

上一篇:云計算、大數據與人工智能三者的關系
下一篇:大數據下的用戶畫像和標簽體系構建

分享到: 收藏