Преглед изворни кода

refactor(manual/trd): 订单补数 rebucket 换回 explode 一次跑完

per-day 循环要跑 4 次;改回按活动日 explode(创建日+变更日)一个 INSERT
覆盖 0716~0719,单次执行,注释讲清为何每单需落两分区。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
tianyu.chu пре 2 недеља
родитељ
комит
a5893e8046

+ 25 - 20
manual/backfill/20260721_ods_trd_card_group_order_info_backfill_rebucket.sql

@@ -2,18 +2,24 @@
 -- 日期:2026-07-21
 -- 工单:(无)
 -- 目的:一次性补数重灌——读中转表 raw.tmp_trd_card_group_order_info(dt=20260721) 当前态全量,
---       按与日常完全相同的口径(create 日 OR 变更日 = ${dt},按 ${dt} 分桶)重灌 ods 单日分区;
---       对 0716~0719 各跑一次,修复此前按日 re-pull 弄残的这几天。
+--       每单按「活动日」落 ods 的 0716~0719 分区:
+--         创建日一份(保证这几天新建的单在 ful 完整)
+--       + 变更日一份(保证创建更早、这几天改过的单,其最新态能进 ful)。
+--       一个 INSERT 覆盖 4 天,故每单用 explode 炸成 创建日/变更日 两行(同日只一份)。
 -- 状态:[待执行]
--- 备注:口径与 jobs/ods/trd/ods_trd_card_group_order_info_inc_d.sql 一致,只把源从
---         raw inc(48h 双分区)换成 tmp 单次快照(dt=20260721,无双源故不读 pdt);
---       每次 -dt 一天,OVERWRITE 该天分区;0720 交今天的日调度自愈,不在此补;
---       tmp 一单一行,去重 (id) 为空操作,保留以对齐日常写法;
---       跑法(逐日,0716~0719 各一次):
---         for d in 20260716 20260717 20260718 20260719; do
---           python3 bin/spark-sql-starter.py -f manual/backfill/20260721_ods_trd_card_group_order_info_backfill_rebucket.sql -dt $d
---         done
---       跑完并核对无误后 DROP TABLE raw.tmp_trd_card_group_order_info。
+-- 备注:口径与 jobs/ods/trd/ods_trd_card_group_order_info_inc_d.sql 一致——explode 相当于把日常
+--         「按天各跑一次」的外层循环内联进一次 OVERWRITE(等价于跑四遍,省成一遍);
+--       动态分区 OVERWRITE 只覆盖 SELECT 出现的 0716~0719,不动历史与 0720+(本环境默认 DYNAMIC);
+--       0720 交今天的日调度自愈,故 WHERE 封顶 0719;
+--       tmp 一单一行、创建日≠变更日 → (id,act_dt) 天然不重,无需去重;
+--       DISTRIBUTE BY act_dt 防每分区小文件(ADR-15);
+--       跑法(一次):python3 bin/spark-sql-starter.py -f manual/backfill/20260721_ods_trd_card_group_order_info_backfill_rebucket.sql
+--       跑完并核对无误后 DROP TABLE raw.tmp_trd_card_group_order_info(内部表连数据一起清)。
+
+SET hive.exec.dynamic.partition=true;
+SET hive.exec.dynamic.partition.mode=nonstrict;
+SET hive.exec.max.dynamic.partitions=2000;
+SET hive.exec.max.dynamic.partitions.pernode=2000;
 
 INSERT OVERWRITE TABLE ods.ods_trd_card_group_order_info_inc_d PARTITION (dt)
 SELECT
@@ -109,17 +115,16 @@ SELECT
     CAST(self_pickup_time          AS TIMESTAMP)     AS self_pickup_time,
     CAST(act_discount              AS DECIMAL(20,4)) AS act_discount,
     CASE WHEN del_flg = '1' THEN TRUE ELSE FALSE END AS is_deleted,
-    ods_dt                                           AS dt
+    act_dt                                           AS dt
 FROM (
     SELECT *,
-        '${dt}' AS ods_dt,
-        ROW_NUMBER() OVER (
-            PARTITION BY id
-            ORDER BY COALESCE(NULLIF(update_time, ''), create_time) DESC
-        ) AS rn
+        DATE_FORMAT(create_time, 'yyyyMMdd')                                    AS cdt,   -- 创建日
+        DATE_FORMAT(COALESCE(NULLIF(update_time, ''), create_time), 'yyyyMMdd') AS udt    -- 变更日
     FROM raw.tmp_trd_card_group_order_info
     WHERE dt = '20260721'
-      AND ( DATE_FORMAT(create_time, 'yyyyMMdd') = '${dt}'
-            OR DATE_FORMAT(COALESCE(NULLIF(update_time, ''), create_time), 'yyyyMMdd') = '${dt}' )
 ) t
-WHERE t.rn = 1;
+LATERAL VIEW explode(
+    CASE WHEN cdt = udt THEN array(cdt) ELSE array(cdt, udt) END   -- 同日一份;跨日炸成 创建日+变更日 两行
+) e AS act_dt
+WHERE act_dt BETWEEN '20260716' AND '20260719'
+DISTRIBUTE BY act_dt;