README.md 1.8 KB

幂等性测试

验证 Spark 2.4 动态分区 INSERT OVERWRITE 的默认行为,影响 ods 调度幂等性。

跑法(在 m2)

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=20260501dt=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 配置变更可能改变默认行为,回归靠重跑此测试。