Forráskód Böngészése

fix(ods/trd): ful_d 改内部表 + 保留 2 天 drop 写进 merge SQL

外部表 DROP PARTITION 只摘元数据不删 HDFS 文件,保留策略会失效;ful_d
是 inc 的派生表、重跑 seed 可重建,改内部表让 drop 真正释放空间。
保留 7 天改 2 天,drop 用精确分区值 ${rdt}=T-3(Spark SQL 的 DROP
PARTITION 不支持比较式),DS 需传 rdt=$[yyyyMMdd-3]。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
tianyu.chu 2 hete
szülő
commit
8b7818d205

+ 7 - 3
jobs/ods/trd/ods_trd_card_group_info_ful_d.sql

@@ -9,9 +9,10 @@
 --       "Cannot overwrite a path that is also being read from"。静态分区的输出是具体分区目录,不重叠。
 --       起点由 manual/backfill/20260717_..._ful_d_seed.sql 一次性 seed;断链需重新 seed。
 --       历史多版本在 inc 表(拉链底座),本表只保当前态。lock 是保留字,SELECT 里必须带反引号。
---       **分区保留 7 天**:本 SQL 不做 drop(Spark SQL 对 DROP PARTITION 比较式过滤支持存疑),
---       由 DS 后置任务用 Hive 执行:
---         ALTER TABLE ods.ods_trd_card_group_info_ful_d DROP IF EXISTS PARTITION (dt < '$[yyyyMMdd-8]');
+--       **分区保留 2 天**(只留 ${dt} 与 ${pdt}):文末 ALTER 精确 drop ${rdt}(=${dt}-2,即 T-3),
+--       每天正好掉一个。用精确分区值而非 dt < 'x'——Spark SQL 的 DROP PARTITION 只接受 col=value,
+--       比较式是 Hive 语法、Spark 解析不了。DS 需额外传参 rdt=$[yyyyMMdd-3];手动跑加 -p rdt=<T-3>。
+--       代价:漏跑一天则那天本该掉的分区不会被补 drop,需手工清;断链重新 seed 即可。
 
 INSERT OVERWRITE TABLE ods.ods_trd_card_group_info_ful_d PARTITION (dt='${dt}')
 SELECT
@@ -49,3 +50,6 @@ FROM (
     ) u
 ) t
 WHERE t.rn = 1;
+
+-- 保留 2 天:drop 掉 ${dt}-2(T-3)这一个分区
+ALTER TABLE ods.ods_trd_card_group_info_ful_d DROP IF EXISTS PARTITION (dt='${rdt}');

+ 7 - 3
jobs/ods/trd/ods_trd_card_group_order_info_ful_d.sql

@@ -9,9 +9,10 @@
 --       "Cannot overwrite a path that is also being read from"。静态分区的输出是具体分区目录,不重叠。
 --       起点由 manual/backfill/20260717_..._ful_d_seed.sql 一次性 seed;断链需重新 seed。
 --       历史多版本在 inc 表(拉链底座),本表只保当前态。
---       **分区保留 7 天**:本 SQL 不做 drop(Spark SQL 对 DROP PARTITION 比较式过滤支持存疑),
---       由 DS 后置任务用 Hive 执行:
---         ALTER TABLE ods.ods_trd_card_group_order_info_ful_d DROP IF EXISTS PARTITION (dt < '$[yyyyMMdd-8]');
+--       **分区保留 2 天**(只留 ${dt} 与 ${pdt}):文末 ALTER 精确 drop ${rdt}(=${dt}-2,即 T-3),
+--       每天正好掉一个。用精确分区值而非 dt < 'x'——Spark SQL 的 DROP PARTITION 只接受 col=value,
+--       比较式是 Hive 语法、Spark 解析不了。DS 需额外传参 rdt=$[yyyyMMdd-3];手动跑加 -p rdt=<T-3>。
+--       代价:漏跑一天则那天本该掉的分区不会被补 drop,需手工清;断链重新 seed 即可。
 
 INSERT OVERWRITE TABLE ods.ods_trd_card_group_order_info_ful_d PARTITION (dt='${dt}')
 SELECT
@@ -44,3 +45,6 @@ FROM (
     ) u
 ) t
 WHERE t.rn = 1;
+
+-- 保留 2 天:drop 掉 ${dt}-2(T-3)这一个分区
+ALTER TABLE ods.ods_trd_card_group_order_info_ful_d DROP IF EXISTS PARTITION (dt='${rdt}');

+ 7 - 5
manual/ddl/ods/trd/ods_trd_card_group_info_ful_d_create.sql

@@ -7,12 +7,15 @@
 --       构建:seed 一次性全量(manual/backfill/20260717_..._ful_d_seed.sql)
 --             日常 merge(jobs/ods/trd/ods_trd_card_group_info_ful_d.sql):
 --               full dt=${dt} ← full dt=${pdt} ⨝ inc dt=${dt},按 id 取 max(COALESCE(update_time,create_time))
---       分区保留 7 天,更早由 merge 后的 drop 步骤清理(kb/90 待办 3 的保留工具尚未实现,暂手工/DS 任务做)。
+--       分区保留 2 天(只留 ${dt} 与 ${pdt}),由 merge SQL 文末的 ALTER 精确 drop ${rdt}=T-3 清理。
+--       **内部表(managed)而非外部表**:外部表的 DROP PARTITION 只摘元数据、HDFS 文件不删,
+--       保留 2 天会形同虚设。本表从 inc 派生、重跑 seed 即可重建,无外部表兜底诉求,
+--       用内部表让 drop 真正释放空间(这是与 ods inc 外部表约定的有意偏离)。
 --       历史多版本在 inc 表(拉链底座),本表只承担"当前态供下游直接 JOIN"。
 
 DROP TABLE IF EXISTS ods.ods_trd_card_group_info_ful_d;
 
-CREATE EXTERNAL TABLE IF NOT EXISTS ods.ods_trd_card_group_info_ful_d (
+CREATE TABLE IF NOT EXISTS ods.ods_trd_card_group_info_ful_d (
     id                          BIGINT         COMMENT 'id',
     merchant_id                 BIGINT         COMMENT '商家id',
     appid                       STRING         COMMENT '所属程序',
@@ -130,7 +133,6 @@ CREATE EXTERNAL TABLE IF NOT EXISTS ods.ods_trd_card_group_info_ful_d (
     merchant_open               BIGINT         COMMENT '支持商家代开卡密:默认0不支持,1支持',
     is_deleted                  BOOLEAN        COMMENT '软删除归一(CASE WHEN del_* THEN TRUE)'
 )
-COMMENT '拼团信息全量最新态表(每 dt = 当日结束时每条当前态,保留 7 天)'
+COMMENT '拼团信息全量最新态表(每 dt = 当日结束时每条当前态,保留 2 天)'
 PARTITIONED BY (dt STRING)
-STORED AS ORC
-LOCATION '/user/hive/warehouse/ods.db/ods_trd_card_group_info_ful_d';
+STORED AS ORC;

+ 7 - 5
manual/ddl/ods/trd/ods_trd_card_group_order_info_ful_d_create.sql

@@ -7,12 +7,15 @@
 --       构建:seed 一次性全量(manual/backfill/20260717_..._ful_d_seed.sql)
 --             日常 merge(jobs/ods/trd/ods_trd_card_group_order_info_ful_d.sql):
 --               full dt=${dt} ← full dt=${pdt} ⨝ inc dt=${dt},按 id 取 max(COALESCE(update_time,create_time))
---       分区保留 7 天,更早由 merge 后的 drop 步骤清理(kb/90 待办 3 的保留工具尚未实现,暂手工/DS 任务做)。
+--       分区保留 2 天(只留 ${dt} 与 ${pdt}),由 merge SQL 文末的 ALTER 精确 drop ${rdt}=T-3 清理。
+--       **内部表(managed)而非外部表**:外部表的 DROP PARTITION 只摘元数据、HDFS 文件不删,
+--       保留 2 天会形同虚设。本表从 inc 派生、重跑 seed 即可重建,无外部表兜底诉求,
+--       用内部表让 drop 真正释放空间(这是与 ods inc 外部表约定的有意偏离)。
 --       历史多版本在 inc 表(拉链底座),本表只承担"当前态供下游直接 JOIN"。
 
 DROP TABLE IF EXISTS ods.ods_trd_card_group_order_info_ful_d;
 
-CREATE EXTERNAL TABLE IF NOT EXISTS ods.ods_trd_card_group_order_info_ful_d (
+CREATE TABLE IF NOT EXISTS ods.ods_trd_card_group_order_info_ful_d (
     id                        BIGINT         COMMENT 'id',
     group_info_id             BIGINT         COMMENT '组团信息id',
     merchant_id               BIGINT         COMMENT '商家id',
@@ -106,7 +109,6 @@ CREATE EXTERNAL TABLE IF NOT EXISTS ods.ods_trd_card_group_order_info_ful_d (
     act_discount              DECIMAL(20,4)  COMMENT '平台折扣(拼豆无余额折扣)',
     is_deleted                BOOLEAN        COMMENT '软删除归一(CASE WHEN del_* THEN TRUE)'
 )
-COMMENT '拼团订单全量最新态表(每 dt = 当日结束时每单当前态,保留 7 天)'
+COMMENT '拼团订单全量最新态表(每 dt = 当日结束时每单当前态,保留 2 天)'
 PARTITIONED BY (dt STRING)
-STORED AS ORC
-LOCATION '/user/hive/warehouse/ods.db/ods_trd_card_group_order_info_ful_d';
+STORED AS ORC;