Просмотр исходного кода

feat(raw/trd): 拼团 5/18后回填走中转表 + ODS 重分桶

照订单范式:中转表 tmp_trd_card_group_info(内部表 115 STRING)+ 单 job
dump ini(COALESCE≥2026-05-18 灌 dt=20260716)+ ODS 重分桶 SQL(读中转表
按 ods_dt 动态分区、DISTRIBUTE BY dt、无冗余去重)。窗口取 5/18 因历史块覆盖 create≤5/18。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
tianyu.chu 2 недель назад
Родитель
Сommit
9db416b75e

+ 143 - 0
manual/backfill/20260715_ods_trd_card_group_info_2026rebucket.sql

@@ -0,0 +1,143 @@
+-- 作者:tianyu.chu
+-- 日期:2026-07-15
+-- 工单:(无)
+-- 目的:一次性重分桶——读中转表 raw.tmp_trd_card_group_info(dt=20260716) 全量 5/18 后拼团,
+--       按 ods_dt = COALESCE(update_time,create_time) 的日动态分区写入 ods
+-- 状态:[待执行]
+-- 备注:动态分区 INSERT OVERWRITE 只覆盖 SELECT 出现的 ods_dt(5/18 后各日),不动更早历史分区;
+--       DISTRIBUTE BY dt(=投影后的 ods_dt)防每分区小文件(ADR-15);
+--       不做 (id,ods_dt) 去重——dump 是 PG 单次快照、一单一行、无同日重复,去重空操作。
+--       中间态按决策丢弃:每单只落当前最终态到其最后变更日分区。
+--       跑完确认无误后 DROP TABLE raw.tmp_trd_card_group_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_info_inc_d PARTITION (dt)
+SELECT
+    CAST(id                           AS BIGINT)        AS id,
+    CAST(merchant_id                  AS BIGINT)        AS merchant_id,
+    appid                                               AS appid,
+    name                                                AS name,
+    code                                                AS code,
+    CAST(status                       AS BIGINT)        AS status,
+    specs                                               AS specs,
+    type                                                AS type,
+    random_type                                         AS random_type,
+    CAST(total_price                  AS DECIMAL(20,4)) AS total_price,
+    CAST(copies                       AS BIGINT)        AS copies,
+    CAST(unit_price                   AS DECIMAL(20,4)) AS unit_price,
+    CAST(sold_copies                  AS BIGINT)        AS sold_copies,
+    release_time                                        AS release_time,
+    cycle                                               AS cycle,
+    show_applet                                         AS show_applet,
+    title                                               AS title,
+    msg                                                 AS msg,
+    remark                                              AS remark,
+    CAST(create_time                  AS TIMESTAMP)     AS create_time,
+    update_by                                           AS update_by,
+    CAST(update_time                  AS TIMESTAMP)     AS update_time,
+    CAST(order_quota_min              AS BIGINT)        AS order_quota_min,
+    CAST(order_quota_max              AS BIGINT)        AS order_quota_max,
+    CAST(user_quota_max               AS BIGINT)        AS user_quota_max,
+    CAST(start_time                   AS TIMESTAMP)     AS start_time,
+    marketing_info                                      AS marketing_info,
+    reviewmsg                                           AS reviewmsg,
+    CAST(`lock`                       AS BOOLEAN)       AS `lock`,
+    commission_rate                                     AS commission_rate,
+    year                                                AS year,
+    sport                                               AS sport,
+    manufacturer                                        AS manufacturer,
+    sets                                                AS sets,
+    act                                                 AS act,
+    config                                              AS config,
+    info_config                                         AS info_config,
+    CAST(total_num                    AS BIGINT)        AS total_num,
+    CAST(banner_end_time              AS TIMESTAMP)     AS banner_end_time,
+    add_banner                                          AS add_banner,
+    CAST(finished_time                AS TIMESTAMP)     AS finished_time,
+    display_name                                        AS display_name,
+    CAST(group_sets_no                AS BIGINT)        AS group_sets_no,
+    CAST(close_payment_time           AS TIMESTAMP)     AS close_payment_time,
+    CAST(confirm_send_time            AS TIMESTAMP)     AS confirm_send_time,
+    CAST(close_payment_status         AS BIGINT)        AS close_payment_status,
+    CAST(open_card                    AS BIGINT)        AS open_card,
+    close_payment_record                                AS close_payment_record,
+    CAST(group_full_time              AS TIMESTAMP)     AS group_full_time,
+    CAST(live_create_time             AS TIMESTAMP)     AS live_create_time,
+    CAST(live_start_time              AS TIMESTAMP)     AS live_start_time,
+    CAST(live_end_time                AS TIMESTAMP)     AS live_end_time,
+    CAST(report_start_time            AS TIMESTAMP)     AS report_start_time,
+    CAST(report_end_time              AS TIMESTAMP)     AS report_end_time,
+    CAST(report_review_num            AS BIGINT)        AS report_review_num,
+    CAST(report_review_first_time     AS TIMESTAMP)     AS report_review_first_time,
+    CAST(report_review_end_time       AS TIMESTAMP)     AS report_review_end_time,
+    CAST(review_hold_time             AS TIMESTAMP)     AS review_hold_time,
+    CAST(review_approval_time         AS TIMESTAMP)     AS review_approval_time,
+    CAST(review_num                   AS BIGINT)        AS review_num,
+    config_json                                         AS config_json,
+    CAST(free_flag                    AS BIGINT)        AS free_flag,
+    mer_name                                            AS mer_name,
+    change_type                                         AS change_type,
+    CAST(act_price                    AS DECIMAL(20,4)) AS act_price,
+    act_config_json                                     AS act_config_json,
+    CAST(real_sold_num                AS BIGINT)        AS real_sold_num,
+    CAST(weight                       AS BIGINT)        AS weight,
+    hot_type                                            AS hot_type,
+    CAST(team_first                   AS BIGINT)        AS team_first,
+    prop1                                               AS prop1,
+    prop2                                               AS prop2,
+    prop3                                               AS prop3,
+    CAST(point_rate                   AS BIGINT)        AS point_rate,
+    CAST(point_max                    AS BIGINT)        AS point_max,
+    CAST(point_min                    AS BIGINT)        AS point_min,
+    CAST(list_id                      AS BIGINT)        AS list_id,
+    list_code                                           AS list_code,
+    CAST(mix_copies                   AS BIGINT)        AS mix_copies,
+    sub_type                                            AS sub_type,
+    act_point_type                                      AS act_point_type,
+    CAST(payment_method               AS BIGINT)        AS payment_method,
+    CAST(payment_total_price          AS DECIMAL(20,4)) AS payment_total_price,
+    CAST(payment_commission           AS DECIMAL(20,4)) AS payment_commission,
+    CAST(payment_finished_price       AS DECIMAL(20,4)) AS payment_finished_price,
+    CAST(payment_remain_price         AS DECIMAL(20,4)) AS payment_remain_price,
+    CAST(payment_online_price         AS DECIMAL(20,4)) AS payment_online_price,
+    CAST(exclusive                    AS BIGINT)        AS exclusive,
+    CAST(has_bg                       AS BIGINT)        AS has_bg,
+    CAST(merchant_sort                AS BIGINT)        AS merchant_sort,
+    CAST(del_flg                      AS BIGINT)        AS del_flg,
+    CAST(del_time                     AS TIMESTAMP)     AS del_time,
+    review_account                                      AS review_account,
+    CAST(act_id                       AS BIGINT)        AS act_id,
+    CAST(sold_end_time                AS TIMESTAMP)     AS sold_end_time,
+    CAST(panini_list_id               AS BIGINT)        AS panini_list_id,
+    hot_type_config                                     AS hot_type_config,
+    CAST(goods_type                   AS BIGINT)        AS goods_type,
+    CAST(report_flag                  AS BIGINT)        AS report_flag,
+    CAST(use_coupon                   AS BIGINT)        AS use_coupon,
+    CAST(user_level                   AS BIGINT)        AS user_level,
+    CAST(custom                       AS BIGINT)        AS custom,
+    CAST(gift_card_id                 AS BIGINT)        AS gift_card_id,
+    group_show_name                                     AS group_show_name,
+    CAST(min_card_num                 AS BIGINT)        AS min_card_num,
+    act_type                                            AS act_type,
+    waring_type                                         AS waring_type,
+    CAST(compensation_status          AS BIGINT)        AS compensation_status,
+    point_type                                          AS point_type,
+    first_act_config                                    AS first_act_config,
+    gift_config                                         AS gift_config,
+    CAST(version                      AS BIGINT)        AS version,
+    extra_prop                                          AS extra_prop,
+    CAST(use_member_discount          AS BIGINT)        AS use_member_discount,
+    CAST(merchant_open                AS BIGINT)        AS merchant_open,
+    CASE WHEN del_flg = '1' THEN TRUE ELSE FALSE END    AS is_deleted,
+    ods_dt                                              AS dt
+FROM (
+    SELECT *,
+        DATE_FORMAT(COALESCE(NULLIF(update_time, ''), create_time), 'yyyyMMdd') AS ods_dt
+    FROM raw.tmp_trd_card_group_info
+    WHERE dt = '20260716'
+) t
+DISTRIBUTE BY dt;

+ 39 - 0
manual/backfill/20260715_tmp_trd_card_group_info_2026dump.ini

@@ -0,0 +1,39 @@
+; 作者:tianyu.chu
+; 日期:2026-07-15
+; 工单:(无)
+; 目的:一次性拉拼团 5/18 后活跃记录(当前态)到中转表 raw.tmp_trd_card_group_info 单分区 dt=20260716
+;       替代逐段补数 —— 一个 DataX job 灌完,交给 ODS 动态分区重分桶
+; 状态:[待执行]
+;
+; 配套 DDL:manual/ddl/raw/trd/tmp_trd_card_group_info_create.sql
+; 配套 ODS:manual/backfill/20260715_ods_trd_card_group_info_2026rebucket.sql
+;
+; 窗口:拼团历史块(raw dt=20211027)覆盖 create≤5/18,本 dump 只刷 5/18 之后
+; 运行(无 -backfill,单 job):
+;   python3 bin/datax-hive-import-starter.py \
+;     -ini manual/backfill/20260715_tmp_trd_card_group_info_2026dump.ini \
+;     -start-date 20260716 -stop-date 20260717
+;   说明:${dt}=start_date(runner.py),传 -start-date 20260716 让数据落 dt=20260716;
+;         where 硬编码日期不吃 ${start_date},-stop-date 仅占位。
+
+[reader]
+dataSource = postgresql/prd-poyee-aliyun
+database = hobby_stocks
+table = public.card_group_info
+column = id,merchant_id,appid,name,code,status,specs,type,random_type,total_price,copies,unit_price,sold_copies,release_time,cycle,show_applet,title,msg,remark,create_time,update_by,update_time,order_quota_min,order_quota_max,user_quota_max,start_time,marketing_info,reviewmsg,lock,commission_rate,year,sport,manufacturer,sets,act,config,info_config,total_num,banner_end_time,add_banner,finished_time,display_name,group_sets_no,close_payment_time,confirm_send_time,close_payment_status,open_card,close_payment_record,group_full_time,live_create_time,live_start_time,live_end_time,report_start_time,report_end_time,report_review_num,report_review_first_time,report_review_end_time,review_hold_time,review_approval_time,review_num,config_json,free_flag,mer_name,change_type,act_price,act_config_json,real_sold_num,weight,hot_type,team_first,prop1,prop2,prop3,point_rate,point_max,point_min,list_id,list_code,mix_copies,sub_type,act_point_type,payment_method,payment_total_price,payment_commission,payment_finished_price,payment_remain_price,payment_online_price,exclusive,has_bg,merchant_sort,del_flg,del_time,review_account,act_id,sold_end_time,panini_list_id,hot_type_config,goods_type,report_flag,use_coupon,user_level,custom,gift_card_id,group_show_name,min_card_num,act_type,waring_type,compensation_status,point_type,first_act_config,gift_config,version,extra_prop,use_member_discount,merchant_open
+columnType =
+where = COALESCE(update_time, create_time) >= '2026-05-18'
+querySql =
+splitPk = id
+fetchSize = 1000
+
+[writer]
+dataSource = hdfs/prd-hdfs-ha
+path = /user/hive/warehouse/raw.db/tmp_trd_card_group_info/dt=${dt}/
+column = id,merchant_id,appid,name,code,status,specs,type,random_type,total_price,copies,unit_price,sold_copies,release_time,cycle,show_applet,title,msg,remark,create_time,update_by,update_time,order_quota_min,order_quota_max,user_quota_max,start_time,marketing_info,reviewmsg,lock,commission_rate,year,sport,manufacturer,sets,act,config,info_config,total_num,banner_end_time,add_banner,finished_time,display_name,group_sets_no,close_payment_time,confirm_send_time,close_payment_status,open_card,close_payment_record,group_full_time,live_create_time,live_start_time,live_end_time,report_start_time,report_end_time,report_review_num,report_review_first_time,report_review_end_time,review_hold_time,review_approval_time,review_num,config_json,free_flag,mer_name,change_type,act_price,act_config_json,real_sold_num,weight,hot_type,team_first,prop1,prop2,prop3,point_rate,point_max,point_min,list_id,list_code,mix_copies,sub_type,act_point_type,payment_method,payment_total_price,payment_commission,payment_finished_price,payment_remain_price,payment_online_price,exclusive,has_bg,merchant_sort,del_flg,del_time,review_account,act_id,sold_end_time,panini_list_id,hot_type_config,goods_type,report_flag,use_coupon,user_level,custom,gift_card_id,group_show_name,min_card_num,act_type,waring_type,compensation_status,point_type,first_act_config,gift_config,version,extra_prop,use_member_discount,merchant_open
+columnType =
+fileType = orc
+fileName = tmp_trd_card_group_info
+encoding = UTF-8
+writeMode = truncate
+fieldDelimiter = \t

+ 40 - 0
manual/ddl/raw/trd/tmp_trd_card_group_info_create.sql

@@ -0,0 +1,40 @@
+-- 作者:tianyu.chu
+-- 日期:2026-07-15
+-- 工单:(无)
+-- 目的:一次性中转表——回填拼团 5/18 后数据的落地区,供 ODS 重分桶后即 DROP
+-- 状态:[待执行]
+-- 生命周期:建表 → DataX 灌 dt=20260716(COALESCE≥2026-05-18 拼团 5/18 后活跃单当前态)
+--           → ODS 读 WHERE dt='20260716' 动态分区重分桶 → DROP TABLE(内部表连数据一起清)
+-- 备注:内部表(managed),DROP 自动清 HDFS;数据可从 PG 重抽,无兜底诉求。
+--       115 字段全 STRING,对齐 raw_trd_card_group_info_inc_d。
+
+DROP TABLE IF EXISTS raw.tmp_trd_card_group_info;
+
+CREATE TABLE IF NOT EXISTS raw.tmp_trd_card_group_info (
+    id STRING, merchant_id STRING, appid STRING, name STRING, code STRING,
+    status STRING, specs STRING, type STRING, random_type STRING, total_price STRING,
+    copies STRING, unit_price STRING, sold_copies STRING, release_time STRING, cycle STRING,
+    show_applet STRING, title STRING, msg STRING, remark STRING, create_time STRING,
+    update_by STRING, update_time STRING, order_quota_min STRING, order_quota_max STRING, user_quota_max STRING,
+    start_time STRING, marketing_info STRING, reviewmsg STRING, lock STRING, commission_rate STRING,
+    year STRING, sport STRING, manufacturer STRING, sets STRING, act STRING,
+    config STRING, info_config STRING, total_num STRING, banner_end_time STRING, add_banner STRING,
+    finished_time STRING, display_name STRING, group_sets_no STRING, close_payment_time STRING, confirm_send_time STRING,
+    close_payment_status STRING, open_card STRING, close_payment_record STRING, group_full_time STRING, live_create_time STRING,
+    live_start_time STRING, live_end_time STRING, report_start_time STRING, report_end_time STRING, report_review_num STRING,
+    report_review_first_time STRING, report_review_end_time STRING, review_hold_time STRING, review_approval_time STRING, review_num STRING,
+    config_json STRING, free_flag STRING, mer_name STRING, change_type STRING, act_price STRING,
+    act_config_json STRING, real_sold_num STRING, weight STRING, hot_type STRING, team_first STRING,
+    prop1 STRING, prop2 STRING, prop3 STRING, point_rate STRING, point_max STRING,
+    point_min STRING, list_id STRING, list_code STRING, mix_copies STRING, sub_type STRING,
+    act_point_type STRING, payment_method STRING, payment_total_price STRING, payment_commission STRING, payment_finished_price STRING,
+    payment_remain_price STRING, payment_online_price STRING, exclusive STRING, has_bg STRING, merchant_sort STRING,
+    del_flg STRING, del_time STRING, review_account STRING, act_id STRING, sold_end_time STRING,
+    panini_list_id STRING, hot_type_config STRING, goods_type STRING, report_flag STRING, use_coupon STRING,
+    user_level STRING, custom STRING, gift_card_id STRING, group_show_name STRING, min_card_num STRING,
+    act_type STRING, waring_type STRING, compensation_status STRING, point_type STRING, first_act_config STRING,
+    gift_config STRING, version STRING, extra_prop STRING, use_member_discount STRING, merchant_open STRING
+)
+COMMENT '拼团 5/18 后回填一次性中转表,ODS 消费后 DROP'
+PARTITIONED BY (dt STRING)
+STORED AS ORC;