本数仓 DWD 层(明细层)的字段建模与设计约定。建模方法论(事件 vs 状态拆分、维度建模五步、星型模型)见
20-数仓分层与建模.md§5;命名规则见21-命名规范.md§3.4;时间语义见26-时间语义.md。本文档按"业务过程一节"组织,每节包含业务过程定义 / 粒度 / dt 锚点 / 维度退化策略 / 字段表。
所有 DWD 表必带 etl_time TIMESTAMP + 分区 dt STRING,STORED AS ORC。
按 kb/20 §5.5:每个业务过程一张 _apd_d 事件表(不可变事实,只追加)。订单履约的"下单 / 支付 / 发货 / 签收"各拆一张;拼团循环动作(发起 / 审核 / 拒绝 / 重提交)按需各拆一张。
DWD 直引 DIM 层已清洗字段,不在 DWD 二次清洗、不做空值兜底。如 cgi.sport 脏数据归一在 dim_trd_card_group_ful_d 完成(见 28-dim建模.md §3.2),DWD pay 维度退化时直引 DIM 已清洗的 category。
payment_success_time),不是抽取日dt=T-1,不回算(ODS 漂移已在 ODS 层归位,DWD 不二次兜底)INSERT OVERWRITE 单分区订单支付完成。源表 ods_trd_card_group_order_info_inc_d 中筛选支付成功的订单。
支付成功判定:
WHERE order_type = 'group'
AND status IN (101, 103, 104, 105, 106, 301, 302)
订单 id(一条 card_group_order_info 记录 = 一行)。
DATE(payment_success_time),业务时间分区。同一笔订单在 ODS 层(update_time 锚点)和 DWD 层(业务时间锚点)的分区位置不同,是建模设计的预期。
| 字段来源 | 退化字段 |
|---|---|
dim_trd_card_group_ful_d(拼团 → 品类) |
category / manufacturer / sets / year / list_id / panini_list_id / group_name |
card_group_order_info 自有 |
其他业务字段直存 |
DWD 不二次清洗 category(dim_trd_card_group_ful_d 已归一脏数据)。不带大类 main_category(业务侧定:拼团大类 lv1 业务库原名 first_sport,1 期不引,2 期再讨论)。
业务库 card_group_order_info 部分金额字段在 point_type LIKE 'mer_act%' 时为分单位(积分支付场景),其他时为元单位。DWD 按下表派生统一为元单位(_amt_cny 后缀)。
通式:
CASE
WHEN cgoi.point_type LIKE 'mer_act%' THEN ROUND(cgoi.{业务库字段} / 100.00, 2)
ELSE cgoi.{业务库字段}
END AS {dwd 字段}
派生映射:
| 业务库字段 | DWD 字段 | 公式 | 业务含义 |
|---|---|---|---|
| accounts_payable | payable_amt_cny | 通式 | GMV |
| actual_payment / point | pay_amt_cny | 特例(见下) | Net Revenue(购买偏好口径) |
| trade_amount | trade_amt_cny | 通式 | 订单交易金额 |
| settlement_amount | settle_amt_cny | 通式 | 结算金额(支付那一刻 = 实付,_apd_d 不更新) |
| card_price | card_price_cny | 通式 | 单价应付 |
| act_price | act_price_cny | 通式 | 单价实付 |
| discount | merchant_discount_amt_cny | 通式 | 商家折扣抵扣 |
| discount_amount | discount_amount_amt_cny ❓ | 通式 | ❓ 折扣金额(业务库注释未明确,与 merchant_discount 语义区别 + 最终命名待业务答复) |
| platform_discount | platform_discount_amt_cny | 通式 | 平台券抵扣 |
| act_discount | act_discount_amt_cny | 通式 | 活动折扣(首单等) |
| member_discount | member_discount_amt_cny | 通式 | 会员折扣 |
| point_deduct | point_deduct_amt_cny | 通式 | 积分抵扣金额 |
Net Revenue 特例(mer_act% 时换字段,不是同字段除 100):
CASE
WHEN cgoi.point_type LIKE 'mer_act%' THEN ROUND(cgoi.point / 100.00, 2)
ELSE cgoi.actual_payment
END AS pay_amt_cny
mer_act% 时用 point/100(积分支付场景:积分本质是分单位价格),其他时用 actual_payment。
直取不派生:shipping_cost → shipping_amt_cny、shipping_free_amount → shipping_free_amt_cny(业务侧未给修正逻辑,按元单位直取)。
待业务确认:discount_amount 已纳入派生(按通式),但业务库注释仅"折扣金额"未明确,与 discount(已命名 merchant_discount_amt_cny)语义区别 + 最终命名待业务答复。
DWD 内置以上派生规则,下游不再处理。
| 分组 | 字段 | 类型 | 来源 | 说明 |
|---|---|---|---|---|
| 主键 | order_id | BIGINT | order.id | 订单 id |
| 标识 | order_no | STRING | order | 订单编码 |
| 标识 | combination_no | STRING | order | 拆分订单关联编号 |
| 标识 | give_order_id | BIGINT | order | 赠与关联订单 id |
| 用户维度 | user_id | BIGINT | order | |
| 商家维度 | merchant_id | BIGINT | order | |
| 拼团维度 | group_info_id | BIGINT | order | |
| 拼团维度退化 | group_name | STRING | dim_trd_card_group | 拼团名称 |
| 拼团维度退化 | list_id | BIGINT | dim_trd_card_group | 商家上线 checklist id(业务库快照冗余) |
| 拼团维度退化 | panini_list_id | BIGINT | dim_trd_card_group | 帕尼尼 list id(业务库快照冗余) |
| 拼团维度退化 | category | STRING | dim_trd_card_group | 品类(lv2,DIM 已清洗,权威源) |
| 拼团维度退化 | manufacturer | STRING | dim_trd_card_group | 厂商 |
| 拼团维度退化 | sets | STRING | dim_trd_card_group | 系列 |
| 拼团维度退化 | year | STRING | dim_trd_card_group | 年份(赛季) |
| 收货 | shipping_address_id | BIGINT | order | |
| 数量 | purchase_cnt | BIGINT | order.purchase_count | 购买份数 |
| 数量 | give_cnt | BIGINT | order.give_num | 赠送个数 |
| 金额 | payable_amt_cny | DECIMAL(20,4) | 派生 accounts_payable(见 §2.5) | GMV |
| 金额 | pay_amt_cny | DECIMAL(20,4) | 派生 actual_payment / point(见 §2.5) | Net Revenue(购买偏好口径) |
| 金额 | trade_amt_cny | DECIMAL(20,4) | 派生 trade_amount | 订单交易金额 |
| 金额 | settle_amt_cny | DECIMAL(20,4) | 派生 settlement_amount | 结算金额(支付那一刻=实付,_apd_d 不更新) |
| 金额 | card_price_cny | DECIMAL(20,4) | 派生 card_price | 单价应付 |
| 金额 | act_price_cny | DECIMAL(20,4) | 派生 act_price | 单价实付 |
| 金额 | merchant_discount_amt_cny | DECIMAL(20,4) | 派生 discount | 商家折扣抵扣 |
| 金额 | platform_discount_amt_cny | DECIMAL(20,4) | 派生 platform_discount | 平台券抵扣 |
| 金额 | member_discount_amt_cny | DECIMAL(20,4) | 派生 member_discount | 会员折扣 |
| 金额 | act_discount_amt_cny | DECIMAL(20,4) | 派生 act_discount | 活动折扣 |
| 金额 | point_deduct_amt_cny | DECIMAL(20,4) | 派生 point_deduct | 积分抵扣金额 |
| 金额 | shipping_amt_cny | DECIMAL(20,4) | order.shipping_cost | 运费(直取不派生) |
| 金额 | shipping_free_amt_cny | DECIMAL(20,4) | order.shipping_free_amount | 运费券金额(直取不派生) |
| 金额 | discount_amount_amt_cny ❓ | DECIMAL(20,4) | 派生 discount_amount(见 §2.5) | ❓ 折扣金额(业务库注释未明确,与 merchant_discount 语义区别 + 最终命名待业务答复) |
| 积分 | point | BIGINT | order | 消耗积分 |
| 积分 | discount_point | BIGINT | order | 折扣积分 |
| 优惠券 | coupon | BIGINT | order | 优惠券 id |
| 优惠券 | platform_coupon | BIGINT | order | 平台券 id |
| 优惠券 | shipping_free_id | BIGINT | order | 运费券 id |
| 支付 | payment_type | STRING | order | 支付方式-交易类型 |
| 支付 | payment_sub_type | STRING | order | 支付子分类 |
| 支付 | payment_status | STRING | order | 交易状态 |
| 支付 | payment_status_desc | STRING | order | 交易状态描述 |
| 支付 | payment_time | TIMESTAMP | order | 支付时间 |
| 支付 | payment_success_time | TIMESTAMP | order | 支付完成时间(dt 锚点) |
| 支付 | pay_record | TINYINT | order | 是否重复支付 |
| 业务标记 | order_type | STRING | order | 订单类型 |
| 业务标记 | order_sub_type | STRING | order | 订单子类型(含赠与) |
| 业务标记 | give_user_code | STRING | order | 赠与人 |
| 业务标记 | anonymous | BOOLEAN | order | 是否匿名 |
| 业务标记 | pick_up_type | STRING | order | 提货方式 |
| 业务标记 | point_type | STRING | order | 使用积分类型 |
| 业务标记 | open_self | TINYINT | order | 是否商家代拆(默认 0,1=商家待拆) |
| 时间 | order_create_time | TIMESTAMP | order.create_time | 下单时间 |
| 时间 | expire_time | TIMESTAMP | order | 过期时间 |
| 软删 | is_deleted | BOOLEAN | order | 软删归一 |
| 框架 | etl_time | TIMESTAMP | 派生 | ETL 处理时间 |
| 分区 | dt | STRING | DATE(payment_success_time) |
业务时间分区 |
未纳入字段(按事件不可变设计,归
dim_trd_order_zip_d拉链或后续业务事件表):status/serve_status/update_time/refuse_status/waring_type/waring_status/goods_allocate/invoice_id。