|
|
@@ -86,7 +86,7 @@ DS 项目级 globalParams(poyee-data-warehouse 项目,所有工作流继承
|
|
|
- **跨日漂移修正**: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`,分区内取最新版本
|
|
|
- **跨 ods dt 不去重**:同 pk 多 dt 分区并存 = 上层拉链表(SCD Type 2)的底层
|
|
|
-- **重跑幂等前提**:`spark.sql.sources.partitionOverwriteMode = DYNAMIC`(必设;STATIC 模式动态分区会清空全表,违反幂等,详见 §8)
|
|
|
+- **重跑幂等**:动态分区 INSERT OVERWRITE 只覆盖 SELECT 出现的 dt,其他历史 dt 保留(实测见 §8 + tests/integration/spark/idempotence/)
|
|
|
|
|
|
## 6. dwd / dws / ads 层 dt 语义
|
|
|
|
|
|
@@ -108,19 +108,21 @@ raw / ods 都按 "sched 唯一锚定 + INSERT OVERWRITE 单 dt 分区" 模式:
|
|
|
- 日期递增串行(sched=5/1, 5/2, 5/3 ... 依次跑):每次写自己的 dt 分区,互不干扰
|
|
|
- ✓ 幂等,✓ 任意顺序
|
|
|
|
|
|
-### Spark `partitionOverwriteMode` 必读
|
|
|
+### Spark `partitionOverwriteMode` 实测
|
|
|
|
|
|
-Spark 2.x 默认 `spark.sql.sources.partitionOverwriteMode = STATIC`。本项目 ods 用动态分区 `PARTITION (dt)` + SELECT 带出 dt 列,**必须显式改为 DYNAMIC**:
|
|
|
+`spark.sql.sources.partitionOverwriteMode` 控制 Spark 在动态分区 `INSERT OVERWRITE TABLE x PARTITION (col)` 时的覆盖行为:
|
|
|
|
|
|
| 模式 | 动态分区 INSERT OVERWRITE 行为 |
|
|
|
|---|---|
|
|
|
-| STATIC(Spark 2.x 默认) | 覆盖整张表所有分区,没在 SELECT 出现的历史 dt 全部消失 |
|
|
|
+| STATIC | 覆盖整张表所有分区,没在 SELECT 出现的历史 dt 全部消失 |
|
|
|
| DYNAMIC | 只覆盖 SELECT 实际产生的那些 dt,其他历史分区保留 |
|
|
|
|
|
|
-STATIC 模式下日常调度跑一次就清空 ods 全表,每天只剩当天一个 dt——彻底反幂等。**DYNAMIC 是本项目 ods 调度的硬前提**。
|
|
|
-
|
|
|
PARTITION 子句静态指定值(如 `PARTITION (dt='20260507')`)不受此模式影响——无论 STATIC / DYNAMIC 都只覆盖指定的那个分区。
|
|
|
|
|
|
+**本环境实测**(2026-05-07,tests/integration/spark/idempotence/partition_overwrite_default.sql):Spark 2.4 + CDH 6.3.2 + Hive ORC EXTERNAL TABLE 不显式设置时**默认即 DYNAMIC** —— 灌 5 个 dt 后跑动态分区 INSERT OVERWRITE 只产 2 个 dt,剩 5 个分区(03/04 被覆盖,01/02/05 保留),符合 DYNAMIC 语义。
|
|
|
+
|
|
|
+不需要在 `dw_base/spark/spark_sql.py` 显式设 DYNAMIC,也不需要在 ods SQL 顶部加 SET。本环境实测结果是这样,但 Spark / Hive 升级或 CDH 配置变更可能改变默认行为,回归靠 §"幂等测试"。
|
|
|
+
|
|
|
### 幂等测试(入仓守护)
|
|
|
|
|
|
幂等性必须由 tests/ 下集成测试守护:跑两次(或日期递增多次)验证 dt 分区集合一致、行数一致。具体测试设计见后续阶段。
|