# 幂等性测试 验证 Spark 2.4 动态分区 `INSERT OVERWRITE` 的默认行为,影响 ods 调度幂等性。 ## 跑法(在 m2) ```bash cd /home/bigdata/release/poyee-data-warehouse python3 bin/spark-sql-starter.py -f tests/integration/spark/idempotence/partition_overwrite_default.sql -dt 20260507 ``` `-dt` 只是占位(SQL 不依赖 `${dt}`),随便填一天。 ## 判读(看 stdout 输出) **关注点 A**(初始 SHOW PARTITIONS):应输出 5 行,`dt=20260501` 到 `dt=20260505` **关注点 B**(跑完动态分区 INSERT OVERWRITE 后 SHOW PARTITIONS): - 输出 **5 行** → 默认是 **DYNAMIC**:只覆盖 SELECT 出现的 03 / 04,其他保留 - 输出 **2 行**(仅 03 / 04)→ 默认是 **STATIC**:动态分区会清空全表,反幂等 **关注点 C**(SELECT *): - DYNAMIC:`(1, init-501, 01) (2, init-502, 02) (99, rewritten-503, 03) (100, rewritten-504, 04) (5, init-505, 05)` 共 5 行 - STATIC:`(99, rewritten-503, 03) (100, rewritten-504, 04)` 共 2 行 ## 跑完反馈 把关注点 B + C 的输出贴回,依此决定 ods 调度是否需要显式 set DYNAMIC。 ## 实测结果(2026-05-07) 环境:Spark 2.4 + CDH 6.3.2 + Hive ORC EXTERNAL TABLE,不显式设置 `spark.sql.sources.partitionOverwriteMode`。 - 关注点 A:5 个分区 ✓(dt=20260501..20260505) - 关注点 B:**5 个分区**(dt=20260501..20260505 全在)→ **DYNAMIC 行为** - 关注点 C:**5 行** - `(1, init-501, 20260501)` 保留 - `(2, init-502, 20260502)` 保留 - `(99, rewritten-503, 20260503)` 被覆盖 - `(100, rewritten-504, 20260504)` 被覆盖 - `(5, init-505, 20260505)` 保留 **结论**:本环境默认即 DYNAMIC,ods 调度无需显式设置 `partitionOverwriteMode`。Spark / Hive 升级或 CDH 配置变更可能改变默认行为,回归靠重跑此测试。