明細粒度事實層(DWD)
明細粒度事實層以業務過程驅動模組化,基于每個具體的業務過程特點,建構最細粒度的明細層事實表。您可以結合企業的資料使用特點,将明細事實表的某些重要次元屬性字段做适當備援,即寬表化處理。
公共彙總粒度事實層(DWS)和明細粒度事實層(DWD)的事實表作為資料倉庫次元模組化的核心,需緊繞業務過程來設計。通過擷取描述業務過程的度量來描述業務過程,包括引用的次元和與業務過程有關的度量。度量通常為數值型資料,作為事實邏輯表的依據。事實邏輯表的描述資訊是事實屬性,事實屬性中的外鍵字段通過對應次元進行關聯。
事實表中一條記錄所表達的業務細節程度被稱為粒度。通常粒度可以通過兩種方式來表述:一種是次元屬性組合所表示的細節程度,一種是所表示的具體業務含義。
作為度量業務過程的事實,通常為整型或浮點型的十進制數值,有可加性、半可加性和不可加性三種類型:
- 可加性事實是指可以按照與事實表關聯的任意次元進行彙總。
- 半可加性事實隻能按照特定次元彙總,不能對所有次元彙總。例如庫存可以按照地點和商品進行彙總,而按時間次元把一年中每個月的庫存累加則毫無意義。
- 完全不可加性,例如比率型事實。對于不可加性的事實,可分解為可加的元件來實作聚集。
事實表相對維表通常更加細長,行增加速度也更快。次元屬性可以存儲到事實表中,這種存儲到事實表中的次元列稱為次元退化,可加快查詢速度。與其他存儲在維表中的次元一樣,次元退化可以用來進行事實表的過濾查詢、實作聚合操作等。
明細粒度事實層(DWD)通常分為三種:事務事實表、周期快照事實表和累積快照事實表
- 事務事實表用來描述業務過程,跟蹤空間或時間上某點的度量事件,儲存的是最原子的資料,也稱為原子事實表。
- 周期快照事實表以具有規律性的、可預見的時間間隔記錄事實。
- 累積快照事實表用來表述過程開始和結束之間的關鍵步驟事件,覆寫過程的整個生命周期,通常具有多個日期字段來記錄關鍵時間點。當累積快照事實表随着生命周期不斷變化時,記錄也會随着過程的變化而被修改。
明細粒度事實表設計原則
明細粒度事實表設計原則如下所示:
- 通常,一個明細粒度事實表僅和一個次元關聯。
- 盡可能包含所有與業務過程相關的事實 。
- 隻選擇與業務過程相關的事實。
- 分解不可加性事實為可加的元件。
- 在選擇次元和事實之前必須先聲明粒度。
- 在同一個事實表中不能有多種不同粒度的事實。
- 事實的機關要保持一緻。
- 謹慎處理Null值。
- 使用退化次元提高事實表的易用性。
明細粒度事實表整體設計流程如下圖所示。
在一緻性度量中已定義好了交易業務過程及其度量。明細事實表注意針對業務過程進行模型設計。明細事實表的設計可以分為四個步驟:選擇業務過程、确定粒度、選擇次元、确定事實(度量)。粒度主要是在次元未展開的情況下記錄業務活動的語義描述。在您建設明細事實表時,需要選擇基于現有的表進行明細層資料的開發,清楚所建表記錄存儲的是什麼粒度的資料。
明細粒度事實層(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;