Browse Source

test(spark): 加幂等性默认行为验证测试

tests/integration/spark/idempotence/partition_overwrite_default.sql 验证
Spark 2.4 不设 partitionOverwriteMode 时动态分区 INSERT OVERWRITE 的默认
行为:建测试表、灌 5 个 dt、跑动态分区只产 2 个 dt、看 SHOW PARTITIONS
实际剩几个分区。判定结果决定 ods 调度是否需要显式 DYNAMIC。

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
tianyu.chu 18 giờ trước cách đây
mục cha
commit
f9749898a3

+ 28 - 0
tests/integration/spark/idempotence/README.md

@@ -0,0 +1,28 @@
+# 幂等性测试
+
+验证 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。

+ 37 - 0
tests/integration/spark/idempotence/partition_overwrite_default.sql

@@ -0,0 +1,37 @@
+-- 用途:验证 Spark 2.4 不设 spark.sql.sources.partitionOverwriteMode 时
+-- 动态分区 INSERT OVERWRITE 的实际默认行为。
+-- 跑法见同目录 README.md。
+
+CREATE DATABASE IF NOT EXISTS test;
+
+DROP TABLE IF EXISTS test.idempotence_pom_default;
+
+CREATE EXTERNAL TABLE test.idempotence_pom_default (
+    id  INT,
+    val STRING
+)
+PARTITIONED BY (dt STRING)
+STORED AS ORC
+LOCATION '/user/hive/warehouse/test.db/idempotence_pom_default';
+
+-- 灌初始 5 个 dt
+INSERT OVERWRITE TABLE test.idempotence_pom_default PARTITION (dt='20260501') VALUES (1, 'init-501');
+INSERT OVERWRITE TABLE test.idempotence_pom_default PARTITION (dt='20260502') VALUES (2, 'init-502');
+INSERT OVERWRITE TABLE test.idempotence_pom_default PARTITION (dt='20260503') VALUES (3, 'init-503');
+INSERT OVERWRITE TABLE test.idempotence_pom_default PARTITION (dt='20260504') VALUES (4, 'init-504');
+INSERT OVERWRITE TABLE test.idempotence_pom_default PARTITION (dt='20260505') VALUES (5, 'init-505');
+
+-- 关注点 A:初始分区集合(期望 5 个)
+SHOW PARTITIONS test.idempotence_pom_default;
+
+-- 不设 spark.sql.sources.partitionOverwriteMode,跑动态分区 INSERT OVERWRITE 只产 2 个 dt
+INSERT OVERWRITE TABLE test.idempotence_pom_default PARTITION (dt)
+SELECT 99  AS id, 'rewritten-503' AS val, '20260503' AS dt
+UNION ALL
+SELECT 100 AS id, 'rewritten-504' AS val, '20260504' AS dt;
+
+-- 关注点 B:跑完后分区集合
+SHOW PARTITIONS test.idempotence_pom_default;
+
+-- 关注点 C:实际数据落在哪
+SELECT * FROM test.idempotence_pom_default ORDER BY dt, id;