# BD_Manual:修复 dim_staff_ex 列映射 rankname → rank_name > 影响表:`dwd.dim_staff_ex` > ODS 源表:`ods.staff_info_master` > 修复日期:2026-02-26 > 代码位置:`apps/etl/connectors/feiqiu/tasks/dwd/dwd_load_task.py` > 触发场景:`FLOW_API_FULL` 执行时 `DWD_LOAD_FROM_ODS` 阶段 dim_staff_ex 加载失败 --- ## 1. 变更说明 DWD 加载任务 `DwdLoadTask` 中,`dwd.dim_staff_ex` 的列映射定义错误: ```python # 修复前(错误) ("rank_name", "rankname", None) # 修复后(正确) ("rank_name", "rank_name", None) ``` 映射元组含义:`(dwd_列名, ods_源列名, 类型转换)`。 ODS 表 `ods.staff_info_master` 的实际列名为 `rank_name`(带下划线),而非 `rankname`。此错误导致 PostgreSQL 报 `UndefinedColumn: 字段 "rankname" 不存在`,dim_staff_ex 的 SCD2 合并在每个窗口段均失败(共 4 次)。 --- ## 2. 兼容性影响 | 组件 | 影响 | |------|------| | ETL DWD 层 | dim_staff_ex 恢复正常加载,rank_name 字段将正确从 ODS 映射 | | DWS 层 | 无直接影响(当前无 DWS 任务依赖 dim_staff_ex.rank_name) | | 后端 API | 无影响(后端通过 FDW 读取,表结构未变) | | 小程序 | 无影响 | | DDL | 无变更,表结构不变 | --- ## 3. 回滚策略 此修复仅涉及 Python 代码中的列映射字符串,无 DDL 变更。 回滚步骤: 1. 将 `dwd_load_task.py` 中 dim_staff_ex 映射恢复为 `("rank_name", "rankname", None)` 2. 注意:回滚后 dim_staff_ex 将再次无法加载 rank_name 字段 已加载的数据无需回滚——修复前该字段从未成功写入。 --- ## 4. 验证 SQL ```sql -- 验证 1:确认 ODS 源表列名为 rank_name(非 rankname) SELECT column_name FROM information_schema.columns WHERE table_schema = 'ods' AND table_name = 'staff_info_master' AND column_name IN ('rank_name', 'rankname'); -- 预期:仅返回 rank_name -- 验证 2:确认 DWD 目标表存在 rank_name 列 SELECT column_name FROM information_schema.columns WHERE table_schema = 'dwd' AND table_name = 'dim_staff_ex' AND column_name = 'rank_name'; -- 预期:返回 1 行 -- 验证 3:修复后重跑 ETL,检查 dim_staff_ex 是否有 rank_name 非空数据 SELECT COUNT(*) AS total, COUNT(rank_name) AS has_rank_name FROM dwd.dim_staff_ex WHERE scd2_is_current = 1; -- 预期:has_rank_name > 0(取决于上游数据是否有值) -- 验证 4:对比 ODS 与 DWD 的 rank_name 一致性 SELECT s.id AS staff_id, s.rank_name AS ods_rank_name, d.rank_name AS dwd_rank_name FROM ods.staff_info_master s JOIN dwd.dim_staff_ex d ON s.id = d.staff_id AND d.scd2_is_current = 1 WHERE s.rank_name IS DISTINCT FROM d.rank_name LIMIT 10; -- 预期:修复并重跑后返回 0 行 ``` --- ## 5. 映射修正记录 | 日期 | 字段 | 修正内容 | |------|------|---------| | 2026-02-26 | `rank_name` | ODS 源列名从 `rankname` 修正为 `rank_name`,与 `ods.staff_info_master` DDL 一致 |