天天看點

簡單搞定數倉搭建:數倉模型(DWD)明細粒度事實層(DWD)

明細粒度事實層(DWD)

明細粒度事實層以業務過程驅動模組化,基于每個具體的業務過程特點,建構最細粒度的明細層事實表。您可以結合企業的資料使用特點,将明細事實表的某些重要次元屬性字段做适當備援,即寬表化處理。

公共彙總粒度事實層(DWS)和明細粒度事實層(DWD)的事實表作為資料倉庫次元模組化的核心,需緊繞業務過程來設計。通過擷取描述業務過程的度量來描述業務過程,包括引用的次元和與業務過程有關的度量。度量通常為數值型資料,作為事實邏輯表的依據。事實邏輯表的描述資訊是事實屬性,事實屬性中的外鍵字段通過對應次元進行關聯。

事實表中一條記錄所表達的業務細節程度被稱為粒度。通常粒度可以通過兩種方式來表述:一種是次元屬性組合所表示的細節程度,一種是所表示的具體業務含義。

作為度量業務過程的事實,通常為整型或浮點型的十進制數值,有可加性、半可加性和不可加性三種類型:

  • 可加性事實是指可以按照與事實表關聯的任意次元進行彙總。
  • 半可加性事實隻能按照特定次元彙總,不能對所有次元彙總。例如庫存可以按照地點和商品進行彙總,而按時間次元把一年中每個月的庫存累加則毫無意義。
  • 完全不可加性,例如比率型事實。對于不可加性的事實,可分解為可加的元件來實作聚集。

事實表相對維表通常更加細長,行增加速度也更快。次元屬性可以存儲到事實表中,這種存儲到事實表中的次元列稱為次元退化,可加快查詢速度。與其他存儲在維表中的次元一樣,次元退化可以用來進行事實表的過濾查詢、實作聚合操作等。

明細粒度事實層(DWD)通常分為三種:事務事實表、周期快照事實表和累積快照事實表 

  • 事務事實表用來描述業務過程,跟蹤空間或時間上某點的度量事件,儲存的是最原子的資料,也稱為原子事實表。
  • 周期快照事實表以具有規律性的、可預見的時間間隔記錄事實。
  • 累積快照事實表用來表述過程開始和結束之間的關鍵步驟事件,覆寫過程的整個生命周期,通常具有多個日期字段來記錄關鍵時間點。當累積快照事實表随着生命周期不斷變化時,記錄也會随着過程的變化而被修改。

明細粒度事實表設計原則

明細粒度事實表設計原則如下所示:

  • 通常,一個明細粒度事實表僅和一個次元關聯。
  • 盡可能包含所有與業務過程相關的事實 。
  • 隻選擇與業務過程相關的事實。
  • 分解不可加性事實為可加的元件。
  • 在選擇次元和事實之前必須先聲明粒度。
  • 在同一個事實表中不能有多種不同粒度的事實。
  • 事實的機關要保持一緻。
  • 謹慎處理Null值。
  • 使用退化次元提高事實表的易用性。

明細粒度事實表整體設計流程如下圖所示。

簡單搞定數倉搭建:數倉模型(DWD)明細粒度事實層(DWD)

在一緻性度量中已定義好了交易業務過程及其度量。明細事實表注意針對業務過程進行模型設計。明細事實表的設計可以分為四個步驟:選擇業務過程、确定粒度、選擇次元、确定事實(度量)。粒度主要是在次元未展開的情況下記錄業務活動的語義描述。在您建設明細事實表時,需要選擇基于現有的表進行明細層資料的開發,清楚所建表記錄存儲的是什麼粒度的資料。

明細粒度事實層(DWD)規範

通常您需要遵照的命名規範為:dwd_{業務闆塊/pub}_{資料域縮寫}_{業務過程縮寫}[_{自定義表命名标簽縮寫}] _{單分區增量全量辨別},pub表示資料包括多個業務闆塊的資料。單分區增量全量辨別通常為:i表示增量,f表示全量。例如: dwd_asale_trd_ordcrt_trip_di(A電商公司航旅機票訂單下單事實表,日重新整理增量)及dwd_asale_itm_item_df(A電商商品快照事實表,日重新整理全量)。

本教程中,DWD層主要由三個表構成:

  • 交易商品資訊事實表:dwd_asale_trd_itm_di。
  • 交易會員資訊事實表:dwd_asale_trd_mbr_di。
  • 交易訂單資訊事實表:dwd_asale_trd_ord_di。

建表示例

CREATE TABLE IF NOT EXISTS dwd_asale_trd_itm_di
(
    item_id              BIGINT COMMENT '商品ID',
    item_title           STRING COMMENT '商品名稱',
    item_price           DOUBLE COMMENT '商品價格',
    item_stuff_status    BIGINT COMMENT '商品新舊程度_0全新1閑置2二手',
    item_prov            STRING COMMENT '商品省份',
    item_city            STRING COMMENT '商品城市',
    cate_id              BIGINT COMMENT '商品類目ID',
    cate_name            STRING COMMENT '商品類目名稱',
    commodity_id         BIGINT COMMENT '品類ID',
    commodity_name       STRING COMMENT '品類名稱',
    buyer_id             BIGINT COMMENT '買家ID'
)
COMMENT '交易商品資訊事實表'
PARTITIONED BY (ds     STRING COMMENT '日期')
LIFECYCLE 400;

CREATE TABLE IF NOT EXISTS dwd_asale_trd_mbr_di
(
    order_id         BIGINT COMMENT '訂單ID',
    bc_type          STRING COMMENT '業務分類',
    buyer_id         BIGINT COMMENT '買家ID',
    buyer_nick       STRING COMMENT '買家昵稱',
    buyer_star_id    BIGINT COMMENT '買家星級ID',
    seller_id        BIGINT COMMENT '賣家ID',
    seller_nick      STRING COMMENT '賣家昵稱',
    seller_star_id   BIGINT COMMENT '賣家星級ID',
    shop_id          BIGINT COMMENT '店鋪ID',
    shop_name        STRING COMMENT '店鋪名稱'
)
COMMENT '交易會員資訊事實表'
PARTITIONED BY (ds     STRING COMMENT '日期')
LIFECYCLE 400;

CREATE TABLE IF NOT EXISTS dwd_asale_trd_ord_di
(
    order_id              BIGINT COMMENT '訂單ID',
    pay_order_id          BIGINT COMMENT '支付訂單ID',
    pay_status            BIGINT COMMENT '支付狀态_1未付款2已付款3已退款',
    succ_time             STRING COMMENT '訂單交易結束時間',
    item_id               BIGINT COMMENT '商品ID',
    item_quantity         BIGINT COMMENT '購買數量',
    confirm_paid_amt      DOUBLE COMMENT '訂單已經确認收貨的金額',
    logistics_id          BIGINT COMMENT '物流訂單ID',
    mord_prov             STRING COMMENT '收貨人省份',
    mord_city             STRING COMMENT '收貨人城市',
    mord_lgt_shipping     BIGINT COMMENT '發貨方式_1平郵2快遞3EMS',
    mord_address          STRING COMMENT '收貨人位址',
    mord_mobile_phone     STRING COMMENT '收貨人手機号',
    mord_fullname         STRING COMMENT '收貨人姓名',
    buyer_nick            STRING COMMENT '買家昵稱',
    buyer_id              BIGINT COMMENT '買家ID'
)
COMMENT '交易訂單資訊事實表'
PARTITIONED BY (ds       STRING COMMENT '日期')
LIFECYCLE 400;
           

繼續閱讀