|
|
@@ -307,3 +307,49 @@
|
|
|
- mask conf 格式本身需要重大调整,dq 模块可能要解耦自己维护
|
|
|
|
|
|
- **实施节奏**:表数 ≥ 5 张时启动;< 5 张靠人工巡检 + 偶尔重跑 sync 生成器 diff。
|
|
|
+
|
|
|
+### ADR-08 DIM ful_d 跑批:业界主流模式 B + 字段 CASE WHEN 整组判断
|
|
|
+
|
|
|
+- **状态**:已采纳
|
|
|
+
|
|
|
+ dim ful_d 全量快照需要每日产出最新分区,增量更新方式选型。Hive / Spark 2.4 不支持 MERGE INTO(Hudi / Iceberg / Delta Lake 才有);业务库存在"主动置 NULL"场景(用户解绑某属性时业务库直接写 NULL),字段级 COALESCE 在新值是 NULL、老值非 NULL 时会**错误地用昨日值兜底**导致 dim 数据滞后。
|
|
|
+
|
|
|
+ 本项目第一张 dim 表 `dim_usr_user_ful_d`(kb/28 §2)落地时定下范式,未来所有 dim_*_ful_d 表沿用。
|
|
|
+
|
|
|
+- **决策**:
|
|
|
+
|
|
|
+ - **init**(首次回刷):扫 ods 历史分区 `dt < ${dt}` + `ROW_NUMBER` 取每 pk 最新版本,落 `dim.dt=${pdt}` 单分区
|
|
|
+ - **sche**(日常增量):今日 ods 增量(`dt=${dt}`)+ 昨日 dim 基线(`dt=${pdt}`)+ UNION ALL
|
|
|
+ - today_changed = 今日 ods 各源表(如 base / cert)变更 pk 集合(UNION)
|
|
|
+ - today_rebuilt = today_changed 这些 pk 重 join 形成新 dim 行(FULL OUTER JOIN 多源 + LEFT JOIN 昨日 dim 兜底)
|
|
|
+ - unchanged = 昨日 dim 中 `pk NOT IN today_changed` 的行直接保留
|
|
|
+ - INSERT OVERWRITE `dim.dt=${dt}` PARTITION
|
|
|
+ - **字段合并用 CASE WHEN 按"组"判断**,不是字段级 COALESCE:
|
|
|
+ - 如 base 字段统一 `CASE WHEN bu.id IS NOT NULL THEN bu.x ELSE o.x END`
|
|
|
+ - cert 字段统一 `CASE WHEN ci.user_id IS NOT NULL THEN ci.x ELSE o.x END`
|
|
|
+ - 派生字段(如 is_cert)按业务语义自定义 CASE WHEN
|
|
|
+ - **init 与 sche 同日上线**:sched=T 时 init 灌 `${pdt}`(T-2)+ sche 写 `${dt}`(T-1),链路打通无空窗
|
|
|
+
|
|
|
+- **后果**:
|
|
|
+
|
|
|
+ - 正面:
|
|
|
+ - 业界主流(阿里 OneData / 字节 / 美团 Hive 数仓 SCD Type 1 增量标准范式)
|
|
|
+ - dim 大表只 scan 不 shuffle(broadcast NOT IN / LEFT ANTI 剪枝);shuffle 量小性能稳定
|
|
|
+ - "主动置 NULL" 安全:业务库改 NULL 整组字段同步反映到 dim,不被昨日值错误兜底
|
|
|
+ - init / sche 共用字段表 + 同日打通无空窗
|
|
|
+ - 负面:
|
|
|
+ - 多源(如 base + cert)合并时 CASE WHEN 字段表冗长(每字段 1 行 CASE WHEN)
|
|
|
+ - sche 写法长但结构对称,每张多源 dim 表都要重复一遍
|
|
|
+
|
|
|
+- **候选方案**:
|
|
|
+
|
|
|
+ - **每日全量重算**(扫 ods 历史 + ROW_NUMBER 不依赖昨日 dim):实现最简但每天扫 ods 多 dt 分区文件 IO 开销大;数据量增长后性能下降——否决
|
|
|
+ - **FULL JOIN + 字段级 COALESCE**(`COALESCE(bu.field, o.field)`):写法紧凑但业务库主动置 NULL 时 COALESCE 用昨日值替代今日 NULL 导致 dim 数据滞后——否决
|
|
|
+ - **扫 ods 历史 + broadcast id IN today_changed 剪枝**(不依赖昨日 dim 拉字段):扫 ods 多 dt 分区文件 IO 开销 vs 现版只扫今日单分区——否决,扫描成本更高
|
|
|
+ - **MERGE INTO**(Spark 3+ / Iceberg / Hudi / Delta Lake 原生支持):语义最清晰性能最好;本项目 Spark 2.4 + Hive ORC 不支持——本阶段不取
|
|
|
+
|
|
|
+- **反悔条件**:
|
|
|
+
|
|
|
+ - 迁 Spark 3+ / Iceberg / Hudi / Delta Lake 后改 MERGE INTO(更优)
|
|
|
+ - dim 表数据量增长导致 sche shuffle 性能下降,评估改"分区裁剪 + 局部重算"
|
|
|
+ - 业务库消除"主动置 NULL" 场景后,可放宽到字段级 COALESCE 简化写法
|