瀏覽代碼

docs(kb/26): raw 抓窗 / ods 锚点描述同步加 COALESCE 兜底

§4 抓窗 + §5 过滤 / 写入 / dedupe 与 raw ini + ods SQL 现状对齐。

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
tianyu.chu 23 小時之前
父節點
當前提交
99d48cba9f
共有 1 個文件被更改,包括 4 次插入4 次删除
  1. 4 4
      kb/26-时间语义.md

+ 4 - 4
kb/26-时间语义.md

@@ -73,7 +73,7 @@ DS 项目级 globalParams(poyee-data-warehouse 项目,所有工作流继承
 
 ## 4. raw 层 dt 语义
 
-- **抓窗**:`update_time ∈ [${dt}, ${tdt}) = [T-1, T+1)`,48h 宽窗(raw ini reader.where)
+- **抓窗**:`COALESCE(update_time, create_time) ∈ [${dt}, ${tdt}) = [T-1, T+1)`,48h 宽窗(raw ini reader.where)
 - **写入分区**:dt = `${dt}` = T-1
 - **48h 宽窗设计目的**:覆盖跨日 update_time 漂移(详见 ADR-03 §零点漂移决策)
 - **重跑幂等**:DataX hdfs writer 写 `dt=T-1` 单分区,INSERT OVERWRITE 单分区语义 → 同 sched 重跑结果一致
@@ -81,10 +81,10 @@ DS 项目级 globalParams(poyee-data-warehouse 项目,所有工作流继承
 ## 5. ods 层 dt 语义
 
 - **来源**:raw 双源 union — `WHERE dt IN ('${dt}', '${pdt}')` 即 raw dt=T-1 + raw dt=T-2 两个分区
-- **过滤**:`DATE_FORMAT(update_time, 'yyyyMMdd') = '${dt}'`,只保留 update_time 落在 T-1 那天的记录
-- **写入分区**:动态分区 `PARTITION (dt)`,行级 dt = `DATE_FORMAT(update_time, 'yyyyMMdd')`,配合过滤实际只写到 dt=T-1 一个分区
+- **过滤**:`DATE_FORMAT(COALESCE(update_time, create_time), 'yyyyMMdd') = '${dt}'`,只保留 COALESCE(update_time, create_time) 落在 T-1 那天的记录
+- **写入分区**:动态分区 `PARTITION (dt)`,行级 dt = `DATE_FORMAT(COALESCE(update_time, create_time), 'yyyyMMdd')`,配合过滤实际只写到 dt=T-1 一个分区
 - **跨日漂移修正**:raw dt=T-2 因 48h 宽窗抓到的"漂到 T-1"的部分,被 union 进 ods dt=T-1(详见 ADR-03)
-- **dedupe**:`ROW_NUMBER() OVER (PARTITION BY id, DATE_FORMAT(update_time, 'yyyyMMdd') ORDER BY update_time DESC) = 1`,分区内取最新版本
+- **dedupe**:`ROW_NUMBER() OVER (PARTITION BY id, DATE_FORMAT(COALESCE(update_time, create_time), 'yyyyMMdd') ORDER BY COALESCE(update_time, create_time) DESC) = 1`,分区内取最新版本
 - **跨 ods dt 不去重**:同 pk 多 dt 分区并存 = 上层拉链表(SCD Type 2)的底层
 - **重跑幂等**:动态分区 INSERT OVERWRITE 只覆盖 SELECT 出现的 dt,其他历史 dt 保留(实测见 §8 + tests/integration/spark/idempotence/)