Quellcode durchsuchen

refactor(manual/trd): 订单补数 rebucket 去掉 explode,改按天复用日常口径

同一 SQL 传 -dt 对 0716~0719 各跑一次,create 日 OR 变更日 = ${dt} 按 ${dt} 分桶,
逻辑与 ods inc 日常 SQL 一致,源换成 tmp 单次快照,直观且口径可核对。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
tianyu.chu vor 2 Wochen
Ursprung
Commit
09c2482b42

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

@@ -2,20 +2,18 @@
 -- 日期:2026-07-21
 -- 工单:(无)
 -- 目的:一次性补数重灌——读中转表 raw.tmp_trd_card_group_order_info(dt=20260721) 当前态全量,
---       每单按「活动日」展开:创建日 + 变更日(COALESCE),OVERWRITE 写入 ods 的 0716~0719 分区,
---       修复此前按日 re-pull 弄残的这几天(补回被 COALESCE 甩掉的 create 日 presence)
+--       按与日常完全相同的口径(create 日 OR 变更日 = ${dt},按 ${dt} 分桶)重灌 ods 单日分区;
+--       对 0716~0719 各跑一次,修复此前按日 re-pull 弄残的这几天。
 -- 状态:[待执行]
--- 备注:与日常 ods_trd_card_group_order_info_inc_d.sql 同口径(dt=活动日=创建日∪变更日);
---       分区封顶 0719——0720 交给今天的日调度自愈,别在这抢写;
---       explode 用 CASE 去重「创建日=变更日」的单;tmp 为 PG 单次快照、一单一行,(id,act_dt) 天然不重;
---       动态分区 OVERWRITE 只覆盖 SELECT 出现的 0716~0719,不动历史与 0720+(本环境默认 DYNAMIC);
---       DISTRIBUTE BY act_dt 防每分区小文件(ADR-15);
---       跑完并核对无误后 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;
+-- 备注:口径与 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。
 
 INSERT OVERWRITE TABLE ods.ods_trd_card_group_order_info_inc_d PARTITION (dt)
 SELECT
@@ -111,16 +109,17 @@ 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,
-    act_dt                                           AS dt
+    ods_dt                                           AS dt
 FROM (
     SELECT *,
-        DATE_FORMAT(create_time, 'yyyyMMdd')                                        AS cdt,
-        DATE_FORMAT(COALESCE(NULLIF(update_time, ''), create_time), 'yyyyMMdd')     AS udt
+        '${dt}' AS ods_dt,
+        ROW_NUMBER() OVER (
+            PARTITION BY id
+            ORDER BY COALESCE(NULLIF(update_time, ''), create_time) DESC
+        ) AS rn
     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
-LATERAL VIEW explode(
-    CASE WHEN cdt = udt THEN array(udt) ELSE array(cdt, udt) END
-) e AS act_dt
-WHERE act_dt BETWEEN '20260716' AND '20260719'
-DISTRIBUTE BY act_dt;
+WHERE t.rn = 1;