02-數據倉庫之數據分層


1、數據倉庫ETL

    https://www.cnblogs.com/yjd_hycf_space/p/7772722.html

2、數據倉庫分層

  ODS:原始數據層

      數據來源可能是通過Flume監控、Sqoop導入.......

      Flume可以定義攔截器,進行數據ETL。

      Sqoop可以通過sql語句,進行數據ETL。

      所以很多情況下ods存放的ETL之后的原始數據

      作用:在業務系統和數據倉庫之間形成一個隔離層,保存的是原始數據或者ETL之后的原始數據

  DWD:數據明細層

      是為企業所有級別的決策制定過程,提供所有類型數據支持的戰略集合,是一個包含所有主題的通用的集合

      會在ods層基礎上,可能做三件事:

        ①結構和粒度與ods保持一致,對ods層數據進行再次清洗(去空、去臟數據,去超過極限的數據)
        ②調整壓縮算法、存儲格式

            1、存儲格式:

                HIve的文件存儲格式有四種:TEXTFILE 、SEQUENCEFILE、ORC、PARQUET,前面兩種是行式存儲,后面兩種是列式存儲。

                行式存儲:               

                  優點:

                      a)相關的數據是保存在一起,比較符合面向對象的思維,因為一行數據就是一條記錄

                      b)這種存儲格式比較方便進行INSERT/UPDATE操作

                  缺點:

                      a)如果查詢只涉及某幾個列,它會把整行數據都讀取出來,不能跳過不必要的列讀取。當然數據比較少,一般沒啥問題,如果數據量比較大就比較影響性能

                      b)由於每一行中,列的數據類型不一致,導致不容易獲得一個極高的壓縮比,也就是空間利用率不高

                列式存儲

                  優點:

                      a)查詢時,只有涉及到的列才會被查詢,不會把所有列都查詢出來,即可以跳過不必要的列查詢

                      b)由於每列的數據格式一樣,所以壓縮率高效,不僅節省儲存空間也節省計算內存和CPU

                      c)任何列都可以作為索引

                  缺點:

                      a)INSERT/UPDATE很麻煩或者不方便

                      b)不適合掃描小量的數據

  

                  壓縮比:ORC >  Parquet >  textFile(textfile沒有進行壓縮)

                  查詢速度:當數據量較大時,列式存儲快,數據量小的時候,查詢速度無明顯區別。

            2、壓縮:

                

 

            在ods層,我們希望壓縮算法的壓縮比特別高,用以節省空間!!所以有條件的話會選擇gizp壓縮,文件存儲格式無所謂!!

            DWD、DWS中,我們期望的文件格式是解壓和壓縮速度快,用以提高查詢效率!!一般會選擇Snappy + (orc或者parquet)        //其中如果和spark sql集成了,那么推薦parquet

            例子:

              create external table t(

                .......

                .......

              )comment '測試表'

              partitioned by('dt' string)
              stored as parquet                      //存儲格式
              location '/warehouse/online_trade/dwd/dwd_t'
              tblproperties("parquet.compression"="snappy")        //壓縮算法

        ③看是否能進行維度退化

            比如說大學這個維度,在mysql中分了大學、學院、專業三個維度,那么將其合並成一個維度!
            sql語句比較好實現,也就是三張表合並為一張表(第三范式變為第一范式,直接用join on,這里不寫例子)

            降維的缺點和優點:


              優點:減少shuffle,更貼近星型模型
              缺點:增加了冗余,有些維度表不能共用(比如專業很多學校都開設了,如果變為第一范式(一張表),那么不能共用)

 

             注:這里說的降維並不是全部弄成一張大表,還是需要區分事實表和維度表,是將雪花模型的多級維度進行合並!!!

            

        ④建模

          這個算是這一層最主要的功能了,在這一層的建模中,你必須:

            ①確定建模方式(雪花模型、星型模型等)

            ②根據建模的方式抽取維度表和事實表

            數據建模請參考上一篇文章:https://www.cnblogs.com/lihaozong2013/p/10725830.html

  DWS:數據服務層

      以dwd為基礎,進行輕度匯總,一般聚集到以用戶當日、設備當日、商家當日、商品當日等等的粒度。

      在這層通常會有以某一維度為線索,組成跨主題的寬表,比如一個用戶的當日簽到數、收藏數、評論數、抽獎數、訂閱數、瀏覽商品數、添加購物車數、下單數、支付數等組成的多列表


      注:其實這一層就是一張行為寬表,以時間(每天、每周、每月)統計用戶(商品、商家)所做的所有事!!!(是最重要的中間表)

      注:意義:如果有了這一層,那么對於DM層的什么地區簽到、收藏、總評論數等指標都能靈活實現!!

      

      create external table dws_user_action(
          user_id string comment '用戶id',
          order_count bigint comment '下單次數',
          order_amount decimal(16,2) comment '下單總金額',
          payment_id bigint comment '支付次數',
          payment_amount decimal(16,2) comment '支付總金額',
          addcart_ct bigint comment '購物車添加次數',
          favorite_ct bigint comment '收藏次數',
          comment_ct bigint comment '評論次數',
          ..................                    //還有很多列,對於sql,可以先一個指標一個指標求出來,然后根據user_id join
      )comment '用戶行為寬表' 

      partitioned by('dt' string)
      stored as parquet                      //存儲格式
      location '/warehouse/online_trade/dws/dws_user_action'
      tblproperties("parquet.compression"="snappy")        //壓縮算法

  ADS:數據應用層

    也叫DM:數據集市

    也叫APP:數據應用層

    數據集市,以某個業務應用為出發點而建設的局部dw,dw只關心自己需要的數據,不會全盤考慮企業整體的數據架構和應用。每個應用有自己的DM。

    也就是說,面向實際的數據需求,以DWD或者DWS層的數據為基礎,組成的各種統計報表。


免責聲明!

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



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