如何構建資料倉庫分層
ODS層-->DM層-->DWD層
第一步:
先構建ods_delta表(分割槽:日期,小時,分鐘),開始源源不斷寫入ods_delta表中,只儲存增量資料。
ods_delta表需要在原表基礎上新增如下欄位:
cdc_record_id STRING COMMENT '唯一自增序列號',
cdc_operation STRING COMMENT 'I 插入 U 更新 D 刪除',
cdc_timestamp DATETIME COMMENT 'ODS源表資料同步時間',
cdc_before_image STRING COMMENT '是否更新前資料:Y 是 N 否',
cdc_after_image STRING COMMENT '是否更新後資料:Y 是 N 否',
第二步:
新建ods_full表(無分割槽),ods_full表沒有分割槽,只儲存第一次初始化的全量資料。
ods_full表需要在原表基礎上新增如下欄位:
cdc_record_id STRING COMMENT '唯一自增序列號',
cdc_operation STRING COMMENT 'I 插入 U 更新 D 刪除',
cdc_timestamp DATETIME COMMENT 'ODS源表資料同步時間',
cdc_before_image STRING COMMENT '是否更新前資料:Y 是 N 否',
cdc_after_image STRING COMMENT '是否更新後資料:Y 是 N 否',
第三步:
dm_delta表(分割槽:日期,小時,分鐘)第一次初始化的時候,從ods_full全量抽取資料,放到dm_delta表的19000101,00,00分割槽。
dm_delta表需要在原表基礎上新增如下欄位:
cdc_record_id STRING COMMENT '唯一自增序列號',
cdc_operation STRING COMMENT 'I 插入 U 更新 D 刪除',
cdc_timestamp DATETIME COMMENT 'ODS源表資料同步時間',
cdc_before_image STRING COMMENT '是否更新前資料:Y 是 N 否',
cdc_after_image STRING COMMENT '是否更新後資料:Y 是 N 否',
第四步:
dm_full表(分割槽:日期)第一次初始化時先從ods_full表抽取全量資料,放到當前執行時的當天的日期分割槽中。
dm_full表需要在原表基礎上新增如下欄位:
cdc_record_id STRING COMMENT '唯一自增序列號',
cdc_operation STRING COMMENT 'I 插入 U 更新 D 刪除',
cdc_timestamp DATETIME COMMENT 'ODS源表資料同步時間',
cdc_before_image STRING COMMENT '是否更新前資料:Y 是 N 否',
cdc_after_image STRING COMMENT '是否更新後資料:Y 是 N 否',
第五步:
第二天凌晨執行指令碼,將dm_full表(分割槽:日期)將會以指令碼執行時間的日期作為分割槽的日期,從dm_delta表中按id分組,用row_number() over()函式只取最大時間戳或最大記錄id的那一條記錄存放到dm_full當天分割槽中。也就是說:dm_full表20210901分割槽存放的是20210831 23:59:59時刻的快照資料。
第六步:
每個小時執行一次dm_delta表的抽取作業,將ods_delta表每小時的增量資料(包含增刪改)抽取到dm_delta的小時分割槽中。
第七步:
構建dwd表,dwd表沒有full表,delta表區分,就以dwd加表名稱命名。只有一個分割槽。
第八步:
dwd每次執行會將dm_full表(當日分割槽)和dm_delta表(當天所有分割槽)做一個union all,不去重。
再從union all後的結果中根據id分組,用row_number() over()函式只取最大時間戳或最大記錄id的那一條記錄存放到dwd層表中去,每次執行都是覆蓋dwd原先所有資料。