Sfoglia il codice sorgente

doc: 1.添加开发者鉴权路线 2.添加业务库同步方案及数据资产同步优先级 3 添加hive数据类型映射参考

tianyu.chu 2 settimane fa
parent
commit
b28d87ace1

+ 0 - 4
README.md

@@ -46,10 +46,6 @@ dw-project/
 
 ```
 PG/ES ──DataX(raw)──> RAW ──> ODS ──> DWD ──> DWS ──> TDM ──> ADS
-                                                                           │
-                                                             DataX/BrokerLoad
-                                                                           │
-                                                         Doris / ES / MongoDB
 ```
 
 ## 开发环境

+ 31 - 56
kb/00-项目架构.md

@@ -2,8 +2,7 @@
 
 > `poyee-data-warehouse` 数据仓库工程的模块划分、执行时序与配置管理。
 
-**项目状态**:目前采用**原地渐进式重构**模式。项目根目录当前物理路径为 `tendata-warehouse-release/`(老项目名),将在重构过程中逐步改造为 `poyee-data-warehouse/`。下方目录结构是**目标态**(重构完成后应当长成的样子),不是当前态。当前态请直接查看项目根目录。
-
+**项目状态**:重构中,目前采用**原地渐进式重构**模式。
 ## 1. 目录结构(目标态)
 
 ```
@@ -476,35 +475,28 @@ python3 bin/datax-gc-generator.py --from hdfs --to elasticsearch \
 数仓分层与 `jobs/` 目录一一对应:
 
 ```
-                                              ┌─────────────┐
-┌─────────────────────────────────────────┐  │             │
-│  ADS (Application Data Service)  ads/    │  │             │
-│  应用层:面向产品的宽表 + 导出到服务层    │  │             │
-├─────────────────────────────────────────┤  │             │
-│  TDM (Theme Data Model)          tdm/    │  │  DIM        │
-│  标签层:长表明细+宽表服务+人群包圈选     │  │             │
-├─────────────────────────────────────────┤  │  jobs/dim/  │
-│  DWS (Data Warehouse Service)    dws/    │◄─┤             │
-│  汇总层:聚合统计                        │  │  公共维度    │
-├─────────────────────────────────────────┤  │  贯穿       │
-│  DWD (Data Warehouse Detail)     dwd/    │◄─┤  dwd/dws/   │
-│  明细层:清洗加工 + 维度退化              │  │  tdm/ads    │
-├─────────────────────────────────────────┤  │             │
-│  ODS (Operational Data Store)    ods/    │  │             │
-│  贴源层:类型转换、空值处理、脏数据识别    │  │             │
-├─────────────────────────────────────────┤  │             │
-│  RAW (Raw Data)                  raw/    │  │             │
-│  原始数据采集:全字段 STRING,原样落盘    │  │             │
-└─────────────────────────────────────────┘  └─────────────┘
+                                                ┌────────────┐
+┌───────────────────────────────────────────┐   │            │
+│  ADS  应用层:业务指标、服务端导出宽表      │   │            │
+├───────────────────────────────────────────┤   │            │
+│  TDM  标签层:长表明细 + 宽表 + 人群包      │◄──┤    DIM     │
+├───────────────────────────────────────────┤   │            │
+│  DWS  汇总层:主题聚合、提供公共指标        │◄──┤  公共维度   │
+├───────────────────────────────────────────┤   │            │
+│  DWD  明细层:清洗加工 + 维度退化           │◄──┤            │
+├───────────────────────────────────────────┤   │            │
+│  ODS  贴源层:类型转换、脏数据识别          │   │            │
+├───────────────────────────────────────────┤   └────────────┘
+│  RAW  采集层:全字段 STRING,原样落盘       │
+└───────────────────────────────────────────┘
 
 数据流向:
-  MongoDB/MySQL/ClickHouse ──DataX(raw)──> RAW(Hive)
-  RAW ──SparkSQL(ods)──> ODS ──SparkSQL(dwd)──> DWD
-  DWD ──SparkSQL(dws)──> DWS ──SparkSQL(tdm)──> TDM ──SparkSQL(ads)──> ADS
-  ADS ──DataX/BrokerLoad──> Doris/ClickHouse/ES/MongoDB(服务层)
+  PG / ES ──DataX(raw)──▶ RAW ──SparkSQL(ods)──▶ ODS ──SparkSQL(dwd)──▶ DWD
+  DWD ──SparkSQL(dws)──▶ DWS ──SparkSQL(tdm)──▶ TDM ──SparkSQL(ads)──▶ ADS
+  ADS ──DataX / BrokerLoad──▶ 服务层(Doris / ClickHouse / ES / MongoDB)
 ```
 
-**jobs/ 目录内部组织建议:**
+**jobs/ 目录内部组织:**
 
 每个分层目录内部按**业务域代码**(见 `21-命名规范.md` §3.2,`trd`/`usr`/`prd`/`shp`/`pub`/`dim`)建子目录,每个业务域下放置具体的 ini 或 SQL 文件。样板见 `00-项目架构.md` §9。
 
@@ -532,11 +524,6 @@ jobs/
 
 **原则**:同一业务(如订单)的数据在不同分层之间纵向流转,`trd/` 这一业务域在 raw/ods/dwd/dws/tdm/ads 各层都会出现。
 
-**关于 dim**:dim 与其他分层并列,作为顶层独立目录 `jobs/dim/`,**不**塞在 `jobs/ods/dim/` 下。原因:
-- 维度的生命周期独立于 ods(典型场景:日历表手工 init 一次,年度增量;汇率每日刷一次)
-- 下游 dwd/dws/tdm/ads 都直接 JOIN dim,是平级被引用关系,不是包含关系
-- dim 自己也分业务域(pub/usr/prd/shp),与其他层的二维结构一致
-
 ## 6. 配置管理体系
 
 ### 6.1 配置分类
@@ -718,24 +705,17 @@ bin/datax-multiple-hive-job-starter.sh -gcd jobs/raw/trd -start-date 20260415 -e
 
 **核心原则:DDL 与计算 SQL 物理分离,DDL 全部在 `manual/ddl/` 下单一来源。**
 
-- `manual/ddl/` 存放**所有 DDL**(首次建表 + 后续 ALTER),采用 **migration 模式**:每次 DDL 操作是一个不可变文件,**绝不回头改老文件**
+- `manual/ddl/` 存放**所有 DDL**(首次建表 + 后续 ALTER),采用 **migration 模式**:每次 DDL 操作是一个不可变文件,**禁止回头改老文件**
 - `jobs/` 存放每日调度执行的采集 / 计算任务,只做 `INSERT OVERWRITE` 或数据同步,不写 CREATE TABLE
-- 不存在第二个 ddl 目录,避免"两套 DDL 同步维护"的负担
+
 
 一张表的完整生命周期涉及:
-- `manual/ddl/{表名}.sql` —— 首次建表,永久保留
-- 若干 `manual/ddl/{yyyymmdd}_{表名}_{change}.sql` —— 之后每次 ALTER,独立文件
+- `manual/ddl/{表名}_create.sql` —— 首次建表,永久保留
+- 若干 `manual/ddl/{表名}_{yyyymmdd}_{描述}_change.sql` —— 之后每次 ALTER,独立文件
 - `jobs/{layer}/{domain}/{表名}.sql` —— 每日调度的计算 SQL(不含建表)
 
 ### 9.1 `manual/ddl/` —— DDL 唯一来源
 
-**两类文件**:
-
-| 文件类型 | 命名 | 生命周期 | 幂等 |
-|---|---|---|---|
-| 首次建表 | `{表名}.sql`(无日期前缀) | 永久保留,不归档 | `CREATE TABLE IF NOT EXISTS`(幂等) |
-| 后续 ALTER | `{yyyymmdd}_{表名}_{change}.sql`(带日期前缀) | 执行后保留 3-6 月,归档到 `manual/ddl/archive/` | `ALTER TABLE`(非幂等) |
-
 **目录组织**:扁平存放,不再按 `{layer}/{domain}/` 分子目录 —— 因为每张表只在 `manual/ddl/` 出现一次(外加若干 ALTER 文件),扁平就够用。`grep dwd_trd_ manual/ddl/` 一行命令就能列出某表的所有 DDL 历史。
 
 ```
@@ -758,7 +738,7 @@ manual/ddl/
 -- 业务含义:交易域-订单支付明细-增量-日
 -- 分层:DWD
 -- 更新周期:日 / 增量
--- 负责人:zhu_tianyu
+-- 负责人:tianyu.chu
 -- 创建日期:2026-xx-xx
 -- 工单:TPAD-1001
 -- 状态:已执行 2026-xx-xx
@@ -773,8 +753,7 @@ CREATE TABLE IF NOT EXISTS dwd.dwd_trd_order_pay_inc_d (
     etl_time      TIMESTAMP     COMMENT 'ETL写入时间'
 ) COMMENT '交易域-订单支付明细-增量-日'
 PARTITIONED BY (dt STRING COMMENT '日期分区 yyyyMMdd')
-STORED AS ORC
-TBLPROPERTIES ('orc.compress'='NONE');
+STORED AS ORC;
 ```
 
 **ALTER 文件模板**(`manual/ddl/20260520_dwd_trd_order_pay_add_refund.sql`):
@@ -782,7 +761,7 @@ TBLPROPERTIES ('orc.compress'='NONE');
 ```sql
 -- ============================================================
 -- 表名:dwd.dwd_trd_order_pay_inc_d
--- 作者:zhu_tianyu
+-- 作者:tianyu.chu
 -- 日期:2026-05-20
 -- 工单:TPAD-1234
 -- 目的:加 refund_amt_cny 字段(业务上线退款流程)
@@ -797,7 +776,7 @@ ADD COLUMNS (
 );
 ```
 
-**存储格式约定**:所有分层一律 `STORED AS ORC` + `orc.compress=NONE`(不压缩,放弃一部分磁盘换 CPU、查询速度与 debug 友好度)。
+**存储格式约定**:所有分层一律 `STORED AS ORC` (不压缩,放弃一部分磁盘换 CPU、查询速度与 debug 友好度 ,后期做冷热数据再考虑压缩)。
 
 ### 9.2 `jobs/` 层 —— 每日调度的计算 SQL
 
@@ -821,7 +800,7 @@ jobs/dwd/trd/
 --   - ods.ods_trd_order_pay_inc_d
 --   - dim.dim_prd_product_ful_d
 -- 下游使用:dws_trd_order_agg_inc_d、ads_trd_gmv_d
--- 负责人:zhu_tianyu
+-- 负责人:tianyu.chu
 -- 创建日期:2026-xx-xx
 -- ============================================================
 
@@ -873,7 +852,7 @@ raw 层的 `jobs/` 有两类主要任务,根据源数据形态选择:
 --        编码 UTF-8 / 带表头 / 逗号分隔 / 双引号 quote / 字段内允许换行
 -- 执行器:bin/csv-to-hdfs-starter.py
 -- 暂存路径:/tmp/csv_staging/raw_trd_legacy_order_his_o/
--- 负责人:zhu_tianyu
+-- 负责人:tianyu.chu
 -- 创建日期:2026-xx-xx
 -- 状态:[待执行]
 -- 备注:CTAS 语法一次性建表 + 写入,无需在 manual/ddl/ 单独写 CREATE TABLE
@@ -1002,12 +981,8 @@ jobs/ads/trd/
 
 当要给某张表加列 / 改字段时,**只写新文件,不改老文件**:
 
-1. 在 `manual/ddl/{yyyymmdd}_{表名}_{change}.sql` 写 ALTER 语句(带工单号、目的、回滚方案)
-2. 如果字段参与了 `jobs/` 里的计算 SQL,一并更新 `jobs/{layer}/{domain}/{表名}.sql` 的 `SELECT` 列表
-3. 执行完毕后,把这个 ALTER 文件移到 `manual/ddl/archive/`
+在 `manual/ddl/{yyyymmdd}_{表名}_{change}.sql` 写 ALTER 语句(带工单号、目的、回滚方案)
 
-**为什么不去改原始的 `manual/ddl/{表名}.sql`**:
-- 强行同步两份会让"DDL 唯一来源"形同虚设,增加双写出错概率
 - ALTER 文件按时间前缀线性堆叠,`grep dwd_trd_order_pay manual/ddl/` 即可看到该表的全部 DDL 历史,按文件名时间序回放就是表结构的完整演化
-- 真要在新环境重建这张表,按时间顺序把 `manual/ddl/{表名}.sql` + 所有相关 ALTER 文件依次执行即可,结果和生产一致。**注意**:目前没有自动化重放工具,需要人手按文件名时间序执行;未来视需要可以写一个 `bin/replay-ddl.sh`(当前未实现,**不要假设它存在**
+- 真要在新环境重建这张表,按时间顺序把 `manual/ddl/{表名}.sql` + 所有相关 ALTER 文件依次执行即可,结果和生产一致。**注意**:目前没有自动化重放工具,需要人手按文件名时间序执行;未来视需要可以写一个 `bin/replay-ddl.sh`(当前未实现)
 - 这是数据库 migration 工具(Flyway / Alembic / Liquibase)的标准做法,已被工业界验证

+ 41 - 41
kb/01-运行环境.md

@@ -8,60 +8,60 @@
 自底向上分为数据采集层、数据计算层、数据应用层,LDAP + Ranger 贯穿全栈做用户鉴权与审计日志。
 
 ```
-┌─────────────────────────────────────────────────────────────
-│                       数据应用层  
+┌──────────────────────────────────────────────────────────┐
+│                      数据应用层                           │
 │   指标体系 │ 用户画像 │ 业务模型层 │ BI 可视化 │ 业务数据   │
-└─────────────────────────────────────────────────────────────
-                              
-┌─────────────────────────────────────────────────────────────
-│                       数据计算层  
-│ ┌─────────────────────────────────────────────────────────┐ │
-│ │ 任务调度层:离线 DolphinScheduler │ 实时 StreamPark      │ │
-│ ├─────────────────────────────────────────────────────────┤ │
-│ │ 数据分析层:Impala 即席查询 │ Flink 实时计算              │ │
-│ │               MapReduce 离线 │ Spark 离线                │ │
-│ ├─────────────────────────────────────────────────────────┤ │
-│ │ 资源管理层:YARN / ZooKeeper                             │ │
-│ └─────────────────────────────────────────────────────────┘ │
-└─────────────────────────────────────────────────────────────
-                              
-┌─────────────────────────────────────────────────────────────
-│                       数据采集层  
-│ ┌─────────────────────────────────────────────────────────┐ │
-│ │ 数据存储层:HBase KV │ ClickHouse 列存 │ HDFS 文件 │ Kafka 队列
-│ ├─────────────────────────────────────────────────────────┤ │
-│ │ 数据传输层:DataX 数据同步 │ Flume 日志收集               
-│ ├─────────────────────────────────────────────────────────┤ │
-│ │ 数据源层:PG 业务库 │ ES 埋点库 │ 爬虫数据库 │ 其他数据   │
-│ └─────────────────────────────────────────────────────────┘ │
-└─────────────────────────────────────────────────────────────
+└──────────────────────────────────────────────────────────┘
+                             ▲
+┌──────────────────────────────────────────────────────────┐
+│                      数据计算层                           │
+│ ┌──────────────────────────────────────────────────────┐ │
+│ │ 任务调度层:离线 DolphinScheduler │ 实时 StreamPark   │ │
+│ ├──────────────────────────────────────────────────────┤ │
+│ │ 数据分析层:Impala 即席查询 │ Flink 实时计算          │ │
+│ │             MapReduce 离线  │ Spark 离线              │ │
+│ ├──────────────────────────────────────────────────────┤ │
+│ │ 资源管理层:YARN / ZooKeeper                          │ │
+│ └──────────────────────────────────────────────────────┘ │
+└──────────────────────────────────────────────────────────┘
+                             ▲
+┌──────────────────────────────────────────────────────────┐
+│                      数据采集层                           │
+│ ┌──────────────────────────────────────────────────────┐ │
+│ │ 数据存储层:HBase KV │ ClickHouse 列存 │ HDFS │ Kafka │
+│ ├──────────────────────────────────────────────────────┤ │
+│ │ 数据传输层:DataX 数据同步 │ Flume 日志收集           
+│ ├──────────────────────────────────────────────────────┤ │
+│ │ 数据源层:PG 业务库 │ ES 埋点库 │ 爬虫库 │ 其他数据  
+│ └──────────────────────────────────────────────────────┘ │
+└──────────────────────────────────────────────────────────┘
 
  侧面:LDAP + Ranger(用户鉴权、审计日志)贯穿全栈
 ```
 
-> 绿色块(DolphinScheduler / Impala / MapReduce / Spark / YARN / HDFS / Kafka / DataX / Flume / PG / ES为一二期任务的必要组件,其余为规划/扩展项。
+> DolphinScheduler / Impala / MapReduce / Spark / YARN / HDFS / Kafka / DataX / Flume / PG / ES 为一二期任务的必要组件,其余为规划/扩展项。
 
 ## 2. 技术栈与版本
 
-| 类别 | 组件 | 版本            |
-|------|------|---------------|
-| 发行版 | Cloudera CDH | 6.3.2         |
+| 类别      | 组件 | 版本            |
+|---------|------|---------------|
+| 大数据基座   | Cloudera CDH | 6.3.2         |
 | 分布式文件系统 | HDFS | 3.0.0         |
-| 资源调度 | YARN | 3.0.0         |
-| 数据仓库 | Hive | 2.1.1         |
-| 计算引擎 | Spark | 2.4.0         |
-| 即席查询 | Impala | 3.2.0         |
-| 协调服务 | ZooKeeper | 3.4.5         |
-| 查询入口 | Hue | 4.2.0         |
-| 权限管理 | Apache Ranger | 2.1.0(源码二开集成) |
-| 任务调度 | DolphinScheduler | 3.4.1         |
-| 数据集成 | DataX | 阿里开源版v202309         |
+| 资源调度    | YARN | 3.0.0         |
+| 数据仓库    | Hive | 2.1.1         |
+| 计算引擎    | Spark | 2.4.0         |
+| 即席查询    | Impala | 3.2.0         |
+| 协调服务    | ZooKeeper | 3.4.5         |
+| 即席入口    | Hue | 4.2.0         |
+| 权限管理    | Apache Ranger | 2.1.0(源码二开集成) |
+| 任务调度    | DolphinScheduler | 3.4.1         |
+| 数据集成    | DataX | 阿里开源版v202309         |
 
 **与开发强相关的约束:**
 - Hive 默认计算引擎为 **Spark**(非 MR)
 - Hive on Spark,建表统一 **ORC** 格式
-- Impala 在 CDH 6.3.2 下无法做 Ranger 细粒度授权,敏感表不要通过 Impala 暴露
-- Spark 2.4 / Python 3.6 / PySpark 2.4,避免使用 Spark 3 才有的 API
+- Impala 在 CDH 6.3.2 下无法做 Ranger 细粒度授权,只通过hdfs权限做兜底
+- API版本约束:Spark 2.4 / Python 3.6 / PySpark 2.4
 
 ## 3. 节点拓扑(开发视角)
 

+ 37 - 5
kb/02-权限与账号.md

@@ -5,6 +5,10 @@
 
 ## 1. 认证授权架构
 
+poyee 的鉴权体系有两条并行的入口链路,共用同一套 Ranger 策略和 HDFS 兜底授权:
+
+**链路 A:分析师走 Hue/HiveServer2(身份 = LDAP 账号)**
+
 ```
 用户/分析师
    │  LDAP 登录
@@ -24,12 +28,40 @@
   审计日志落地:Solr + HDFS `/ranger/audit`
 ```
 
+**链路 B:开发/调度走 PySpark / Spark-SQL(身份 = Unix 账号)**
+
+```
+数据开发 / DS JOB
+   │  ssh / ds tenant 以 Unix 账号登录 (bigdata / dolphinscheduler / 个人 unix)
+   ▼
+  spark-submit / pyspark (YARN client/cluster)
+   │  Driver 和 Executor 以 Unix 账号向下游发请求
+   ├──▶ Hive Metastore ── Ranger Hive Plugin(库/表/列元数据授权)
+   │
+   ▼
+  NameNode ── Ranger HDFS Plugin(数据平面兜底授权)
+   │
+   ▼
+  HDFS DataNodes
+   │
+   ▼
+  审计日志落地:Solr + HDFS `/ranger/audit`
+```
+
+> **关键点**:PySpark 不经过 HiveServer2,它直连 Hive Metastore + HDFS。Ranger Hive Plugin 同样作用在 HMS 侧,所以 SQL 语义的库/表/列授权仍然生效;只是不走 HS2 的 doAs 代理。
+
+**账号来源:Ranger UserSync 同时同步 LDAP 和 Unix 组**
+
+- Hue/HiveServer2 进来的是 LDAP 账号 —— Ranger 策略按 LDAP user / group 匹配
+- PySpark / spark-submit / DS JOB 进来的是 Unix 账号(`bigdata`、`dolphinscheduler`、开发个人 unix)—— Ranger 策略按 Unix user / group 匹配
+- 同一条策略可以同时授权给 "LDAP group `analyst`" 和 "Unix group `hadoop`",互不冲突
+
 **开发需要理解的四件事:**
 
-1. **认证(Who)**:所有人从 LDAP 取身份,Hue 和 HiveServer2 都走 LDAP 认证。
-2. **SQL 授权(What)**:HiveServer2 上的 Ranger Hive Plugin 拦截库/表/列级操作。**你的 SQL 被拒多半发生在这一层**。
+1. **身份(Who)**:Hue 路径下是 LDAP 账号;spark-submit / DS JOB 路径下是 Unix 账号。**同一个人在两条链路下对 Ranger 来说是两个身份**,授权不通用
+2. **SQL 授权(What)**:HiveServer2 / Hive Metastore 上的 Ranger Hive Plugin 拦截库/表/列级操作。**你的 SQL 被拒多半发生在这一层**。
 3. **数据面兜底(Where)**:NameNode 上的 Ranger HDFS Plugin 拦截文件路径访问,即使绕过 Hive 直接访问 HDFS 也会被校验。
-4. **doAs 代理**:`hive.server2.enable.doAs=true`,你的作业以**你本人的账号**访问 HDFS,而不是以 `hive` 服务账号。这意味着**个人账号必须有目标路径的权限**,不能假设 hive 服务账号有权限就行。
+4. **doAs 代理(仅链路 A)**:`hive.server2.enable.doAs=true`,Hue/beeline 提交的作业以**你本人的 LDAP 账号**访问 HDFS,而不是以 `hive` 服务账号。意味着 **LDAP 个人账号必须有目标路径的权限**,不能假设 hive 服务账号有权限就行。链路 B(PySpark)天然就是以提交者 Unix 账号发起,无 doAs。
 
 ## 2. 认证授权审计链路
 
@@ -70,8 +102,8 @@ sequenceDiagram
 | **服务账号** `hdfs` | Linux 用户,`supergroup` | 仅平台团队使用,**开发者不应使用** |
 
 **开发注意事项:**
-- 调度任务使用的是 `dolphinscheduler` 账号,**授权给个人账号能跑通,不代表调度任务能跑通**——需要一并把权限授予 `dolphinscheduler` 用户或其所属组。
-- 个人账号用 Hue/beeline 手动跑通后,上调度前一定要用 `dolphinscheduler` 账号再跑一次,否则容易在生产报 permission denied。
+- 调度任务使用的是 `dolphinscheduler/bigdata` 账号,**授权给个人账号能跑通,不代表调度任务能跑通**——需要一并把权限授予 `dolphinscheduler` 用户或其所属组。
+- 个人账号用 Hue/beeline/ssh(开发个人账号) 手动跑通后,上调度时一定要选用正确的ds租户再跑一次,否则容易在生产报 permission denied。
 
 ## 4. 数据源账号(非 LDAP/Ranger 链路)
 

+ 4 - 38
kb/10-业务流程.md

@@ -46,62 +46,28 @@ flowchart LR
 
 ## 2. 业务过程清单
 
-基于上述流程图,可抽取以下关键业务过程与 `数仓分层与建模.md` 的总线矩阵对齐
+关键业务过程与 `数仓分层与建模.md` 的总线矩阵对齐:
 
 ### 2.1 用户侧业务过程
 
 | 业务过程 | 所属域 | 说明 |
 |---------|------|------|
-| `home_expose` | 用户域 | 首页曝光 |
-| `banner_click` | 商品域 | Banner 点击 |
-| `product_query` | 商品域 | 商品查询 |
-| `live_enter` | 用户域 | 进入直播间 |
-| `cart_add` | 交易域 | 加入购物车 |
-| `group_join` | 交易域 | 加入拼团 |
-| `product_detail_view` | 商品域 | 商品详情页浏览 |
-| `play_select` | 交易域 | 玩法选择 |
-| `settle_enter` | 交易域 | 进入结算 |
-| `coupon_use` | 交易域 | 使用优惠券(平台券/商家券) |
-| `sso_login` | 用户域 | SSO 登录 |
-| `order_create` | 交易域 | 正常下单 |
-| `order_pay` | 交易域 | 第三方支付 |
+
 
 ### 2.2 商家侧业务过程
 
 | 业务过程 | 所属域 | 说明 |
 |---------|------|------|
-| `shop_coupon_publish` | 店铺域 | 优惠券发布 |
-| `shop_group_publish` | 店铺域 | 拼团活动发布 |
-| `shop_live_publish` | 店铺域 | 直播开播 |
-| `shop_refund_process` | 店铺域 | 退货退款处理 |
+
 
 ### 2.3 售后环节
 
 | 业务过程 | 所属域 | 说明 |
 |---------|------|------|
-| `refund` | 交易域 | 退货退款 |
-| `rate` | 用户域 | 评价 |
-| `customer_service` | 公共域 | 客户服务工单 |
-| `logistics` | 公共域 | 物流服务 |
-
-## 3. 关键业务特征
-
-- **拼团**:核心玩法,首页/Banner/直播间三条路径均可进入拼团入口
-- **玩法(Play)**:在商品详情页和结算之间存在玩法选择节点,这是一个特殊环节,需要在埋点和建模时单独处理
-- **双优惠券体系**:平台优惠券 和 商家优惠券并行,作用节点都在结算
-- **SSO 单点登录**:影响结算与玩法两个节点,登录态是必要前提
-- **售后闭环**:支付完成后进入售后,售后分发到评价 / 客服 / 物流 / 退货退款四条支线
 
-## 4. 埋点与建模建议
 
-| 事件类型 | 埋点层 | 建模层 |
-|---------|-------|-------|
-| 曝光/点击/浏览 | 神策 SDK | DWD 用户行为事实表(`dwd_usr_*_apd_d`) |
-| 拼团相关 | 神策 + 业务库 | DWD 交易事实表(`dwd_trd_group_*`) |
-| 下单/支付 | 业务库 CDC | DWD 交易事实表(`dwd_trd_order_*_inc_d`) |
-| 售后 | 业务库 CDC | DWD 售后事实表(`dwd_trd_refund_*_inc_d`) |
 
-## 5. 相关文档
+## 3. 相关文档
 
 - [数仓分层与建模](20-数仓分层与建模.md) — 总线矩阵 / 维度建模
 - [数据资产](11-数据资产.md) — 业务库与埋点数据源

+ 11 - 11
kb/11-数据资产.md

@@ -11,9 +11,10 @@
 | 业务生产库 | 2024 年至今 + 部分未完结数据 | 线上 PostgreSQL | 已确认:发版升级(数据结构、表结构)向前兼容旧数据 | 待填 |
 | 离线存档数据 | 2022—2023 年 | 硬盘(离线) | 需要手动恢复 | 待填 |
 
-**后续工作:**
+**入仓前的check list:**
 - 入仓前统计时间维度的数据条数,确认可信数据时间范围
-- 确定是否存在物理删除动作;如有,推行软删除
+- 每张表确定是否存在物理删除动作;如有,推行软删除(目前有些表使用的是del_flag)
+- 每张表确定是否有可靠的增量同步字段,如没有,推行create_time/update_time
 
 ## 2. 埋点数据
 
@@ -70,16 +71,15 @@
 
 暂无。
 
-## 5. 入仓优先级建议
+## 5. 入仓优先级
 
-| 优先级 | 数据源 | 理由 |
-|-----|------|------|
-| P0  | 业务生产库(PG) | 核心业务指标来源 |
-| P0  | 埋点数据 | 用户行为分析基础 |
-| P3  | 爬虫数据 Top 3(ebay / whatnot / 千岛) | 体量大、竞品分析关键 |
-| P3  | 其他活跃爬虫源 | 辅助竞品分析 |
-| P2  | 离线存档数据(2022-2023) | 历史回填,需手动恢复 |
-| P3  | 已停止的爬虫源 | 仅作为历史快照参考 |
+p0 业务库增量数据(调度) 
+p0 业务库基于时间基线的存量数据(一次性)
+p0 埋点库增量数据(调度)
+p0 埋点库基于时间基线的存量数据(一次性)
+p1 业务库离线历史数据 (一次性,需做数据融合)
+p1 埋点库基于时间基线的存量数据(一次性)
+p2 爬虫数据(极脏,需做数据探查和清洗方案)
 
 ## 6. 相关文档
 

+ 92 - 20
kb/20-数仓分层与建模.md

@@ -10,23 +10,25 @@
 
 ## 2. 分层定义
 
-**二维视图(横向分层 × 竖向分域):**
+**二维视图(横向分层 × 公共维度侧柱):**
 
 ```
-            用户域   交易域   商品域   商家域   公共域
-          ┌──────┬──────┬──────┬──────┬──────┐
-ADS 数据应用层:提供数据展示、数据指标                │
-          ├──────┴──────┴──────┴──────┴──────┤
-TDM 标签数据层:长表明细 + 宽表服务 + 人群包圈选       │    ▲
-          ├──────┬──────┬──────┬──────┬──────┤    │
-DWS 数据汇总层:建立汇总宽表,提供公共指标             │   DIM
-          ├──────┴──────┴──────┴──────┴──────┤   公共
-DWD 数据明细层:标准化、维度补全、异常处理             │   维度
-          ├──────┬──────┬──────┬──────┬──────┤    │
-ODS 贴源层:类型转换、空值处理、脏数据识别             │    │
-          ├──────┴──────┴──────┴──────┴──────┤    │
-RAW 原始采集层:全字段 STRING,原样落盘,永不转换       │    │
-          └──────┴──────┴──────┴──────┴──────┘
+                                                ┌────────────┐
+┌───────────────────────────────────────────┐   │            │
+│  ADS  应用层:业务指标、面向服务端宽表      │   │            │
+├───────────────────────────────────────────┤   │            │
+│  TDM  标签层:长表明细 + 宽表 + 人群包      │◄──┤    DIM     │
+├───────────────────────────────────────────┤   │            │
+│  DWS  汇总层:主题聚合、提供公共指标        │◄──┤  公共维度   │
+├───────────────────────────────────────────┤   │            │
+│  DWD  明细层:清洗加工 + 维度退化           │◄──┤            │
+├───────────────────────────────────────────┤   │            │
+│  ODS  贴源层:类型转换、脏数据识别          │   │            │
+├───────────────────────────────────────────┤   └────────────┘
+│  RAW  采集层:全字段 STRING,原样落盘       │
+└───────────────────────────────────────────┘
+
+  竖向分域(贯穿 DWD 及以上):交易 trd / 用户 usr / 商品 prd / 店铺 shp / 公共 pub
 ```
 
 **分层定义表:**
@@ -43,11 +45,10 @@ RAW 原始采集层:全字段 STRING,原样落盘,永不转换       │
 
 数据流:
 ```
-RDS PG / ES ── DataX ──▶ RAW ──▶ ODS ──▶ DWD ──▶ DWS ──▶ TDM ──▶ ADS
-                                                                                │
-                                                                  DataX / Broker Load
-                                                                                
-                                                              
+RDS PG / ES ──DataX──▶ RAW ──SparkSQL──▶ ODS ──▶ DWD ──▶ DWS ──▶ TDM ──▶ ADS
+                                                                             │
+                                                                             ▼ DataX / Broker Load
+                                                            服务层(Doris / CK / ES / Mongo)
 ```
 
 ## 3. 主题域划分
@@ -131,6 +132,36 @@ RDS PG / ES ── DataX ──▶ RAW ──▶ ODS ──▶ DWD ──▶ DWS
 
 > **关键映射**:业务过程 → DWD 事实表;度量 → 事实字段;维度 → DIM 表;派生指标 = 原子指标 + 时间周期 + 修饰词 → DWS/ADS 字段。
 
+### 5.5 DWD 明细粒度设计(合 vs 拆)
+
+**核心规则:粒度相同则合,粒度不同则拆。**
+
+**判断"粒度是否相同"的一个问题**:两个业务动作描述的是不是同一个实体的同一条记录?
+
+- 同一个实体 + 同一条记录(只是状态/阶段不同)→ 合
+- 同一个实体 + 但每次动作产生新记录 → 拆
+- 不同实体 → 拆
+
+**典型场景:**
+
+| 场景 | 粒度关系 | 结论 | 理由 |
+|------|---------|------|------|
+| 拼团发起 vs 拼团成功 | 同一个团的状态变化 | 合 | 粒度都是团 ID,用 status + 多个时间列区分 |
+| 下单 vs 支付 vs 发货 vs 签收 | 同一个订单的生命周期 | 合 | 粒度都是订单 ID,每个阶段一列时间戳(对应 `21-命名规范.md` §2.2 `acc` 快照) |
+| 拼团 vs 订单 | 一对多 | 拆 | 团是团、单是单,粒度不同 |
+| 订单 vs 订单明细行 | 一对多(一个订单多个商品) | 拆 | 行项目有独立粒度 |
+| 浏览 vs 点击 vs 加购 | 各自独立事件流 | 拆 | 每次行为是独立记录(对应 `21-命名规范.md` §2.2 `apd` 快照) |
+
+**自检方法:**
+
+1. **能不能自然地用一行表示?** 如果合并后一行就是一个完整业务实体(一个团、一个订单),各阶段只是多几列时间/状态字段 → 合
+2. **合并后会不会出现一对多导致行膨胀?** 如果合并后同一个 ID 会出现多行 → 说明粒度不同,必须拆
+3. **分析时是否总要 JOIN 回来?** 如果拆了之后大多数分析场景都要把两张表 JOIN 在一起 → 说明本来就该合
+
+**一句话总结**:一行能完整描述一个业务实体就合,合了之后一个 ID 会出现多行就拆。
+
+**状态时间字段的设计**:保留 3-5 个核心状态的时间字段(值为时间戳),其他非核心状态不建新列,使用原始状态码标记当前状态。后期若需要状态流水分析,新建状态流水表(`_apd_d`)而不是改主表。
+
 ## 6. 数据同步策略
 
 > ODS 层从业务库/埋点/爬虫数据接入。关键问题:数据是否存在物理删除,决定增量策略。
@@ -184,6 +215,47 @@ RDS PG / ES ── DataX ──▶ RAW ──▶ ODS ──▶ DWD ──▶ DWS
 
 raw 层是否需要 `etl_load_time` / `src_file` / `src_row_no` 等框架字段,暂不做统一要求,后续实际接入第一批表时再根据需要补充到本节。
 
+### 8.4 ods 层类型映射参考
+
+**总则**:raw 层一律 STRING 兜底同步;类型化在 ods 层完成。下表为 ods 层 `CAST` 目标类型的参考表,具体字段可按业务需要微调(如小金额字段可下沉到 `DECIMAL(16,2)`)。
+
+#### 8.4.1 PostgreSQL → Hive
+
+| PG 类型 | Hive 类型 |
+|---------|-----------|
+| `int2` / `smallint` | `BIGINT` |
+| `int4` / `integer` / `int` | `BIGINT` |
+| `int8` / `bigint` | `BIGINT` |
+| `serial` | `BIGINT` |
+| `bigserial` | `BIGINT` |
+| `numeric` / `decimal` | `DECIMAL(20,4)` |
+| `real` / `float4` | `DECIMAL(20,4)` |
+| `float8` / `double precision` | `DECIMAL(20,4)` |
+| `char` / `character` | `STRING` |
+| `varchar` / `character varying` | `STRING` |
+| `text` | `STRING` |
+| `timestamp` / `timestamp without time zone` | `STRING` |
+| `timestamptz` | `STRING` |
+| `date` | `STRING` |
+| `time` / `timetz` | `STRING` |
+| `boolean` / `bool` | `TINYINT` |
+| `uuid` | `STRING` |
+| `interval` | `STRING` |
+| `tsvector` | `STRING` |
+| `array` | `STRING`(保留 JSON/文本形态,dwd 按需解析) |
+| `hstore` | `MAP<STRING,STRING>` |
+
+**说明**:
+
+- 整数统一 `BIGINT`:避免上游扩位(`int4` → `int8`)时下游被动改表
+- 小数统一 `DECIMAL(20,4)`:覆盖绝大多数金额/比率场景;特殊精度需求(如高精度科学计算)单独评估
+- 布尔用 `TINYINT`(0/1):Hive 的 `BOOLEAN` 与 ORC/Spark 生态兼容性没有 TINYINT 稳定
+- 时间类型全部 `STRING`:保留源端字面量,dwd 层再按需 `to_timestamp` / `to_date`
+
+#### 8.4.2 Elasticsearch → Hive
+
+(待补,首批 ES 埋点库接入时落地)
+
 ## 9. 相关文档
 
 - [命名规范](21-命名规范.md) — 表/字段命名五段式

+ 2 - 2
kb/30-开发规范.md

@@ -146,13 +146,13 @@ flowchart TD
 
 #### 4.2.1 IDE SQL 格式化配置
 
-仓库根的 `kb/sql_style.xml` 是 **JetBrains 系 IDE(PyCharm / DataGrip / IntelliJ)的 SQL Code Style 导出文件**,团队统一从此文件导入,避免每人格式化后 diff 里一堆空白噪音。
+`conf/sql_style.xml` 是 **JetBrains 系 IDE(PyCharm / DataGrip / IntelliJ)的 SQL Code Style 导出文件**,团队统一从此文件导入,避免每人格式化后 diff 里一堆空白噪音。
 
 **导入方式**(PyCharm 为例):
 
 1. `File` → `Settings` → `Editor` → `Code Style` → `SQL`
 2. 右上角齿轮图标 → `Import Scheme` → `IntelliJ IDEA code style XML`
-3. 选择 `kb/sql_style.xml` → 确认覆盖当前 scheme
+3. 选择 `conf/sql_style.xml` → 确认覆盖当前 scheme
 4. 应用后,`Ctrl+Alt+L` 触发格式化即按此风格
 
 **关键风格约定**(所有 SQL 方言统一生效):

+ 0 - 1
kb/90-重构路线.md

@@ -352,7 +352,6 @@ sql = "... WHERE TABLE_SCHEMA='%s' ..." % (database, table_name)
 | `dw_base/oss/oss2_util.py` | 使用场景不明 | 确认后决定保留或删除 |
 | `dw_base/database/mongodb_utils.py` | 约 80% 是注释掉的旧代码 | 清理注释 |
 | `conf/datax/` 下全部内容 | 已废弃的旧配置 | 保留少量样例,其余删除 |
-| `sql_style.xml` | IntelliJ SQL 格式化规则 | 移入 `.idea/` 或删除 |
 
 ## 六、测试体系搭建(中优先级)
 

+ 4 - 0
kb/92-重构进度.md

@@ -119,3 +119,7 @@
 | 2026-04-15 | 阶段 1 目录骨架:新建 `jobs/{raw,ods,dim,dwd,dws,tdm,ads}/` 与 `manual/{ddl,backfill,fix,adhoc,archive}/`,均放 `.gitkeep` 占位 | — |
 | 2026-04-15 | `sql_style.xml` 从项目根移入 `kb/`,`30-开发规范.md` §4.2 补 IDE 格式化导入说明、关键风格表与"不对齐 AS"理由 | — |
 | 2026-04-15 | 新增 `.gitignore` 计划(`90-重构路线.md` §2.4 + 阶段 2 checklist),含 `.idea/` / `.claude/` 部分 ignore 策略、`dw_base.zip` 构建产物、`conf/alerter.conf` 敏感项;阶段 1 仓库改名 checklist 追记 `.iml` 同步改名 | — |
+| 2026-04-18 | `sql_style.xml` 从 `kb/` 移入 `conf/`(IDE 配置不算文档);同步更新 `kb/README.md` 索引、`kb/30-开发规范.md` §4.2.1 路径引用、移除 `kb/90-重构路线.md` §5.1 对应待办行 | — |
+| 2026-04-18 | kb 文档整理:`zhu_tianyu` → `tianyu.chu`(`00-项目架构.md` 2 处负责人注释);`kb/inbox/` 4 份草稿整合完毕 —— `标签服务演进路线.md` 与 `23-标签体系.md §6` 100% 重复直接删除;`dwd明细粒度设计原则.md` 并入 `20-数仓分层与建模.md` §5.5;`hive数据类型映射.md` 并入 `20-数仓分层与建模.md` §8.4(ES→Hive 占位待补);`业务库同步方案.md` 独立成文为 `kb/12-同步方案.md` 并入 README 索引 | — |
+| 2026-04-18 | `02-权限与账号.md §1` 补齐 PySpark 鉴权路线(链路 B):Unix 账号身份 + Ranger UserSync 同时同步 LDAP / Unix group;HS2 doAs 仅链路 A 生效;补漏编号 1 并新增"身份(Who)"条目 | — |
+| 2026-04-18 | 架构框图重排:`01-运行环境.md §1` 大数据平台全景、`20-数仓分层与建模.md §2` 分层 × 维度侧柱、`00-项目架构.md §5` 分层架构图 —— 统一"单层单行 + 右侧 DIM 侧柱"样式,按"中文字符宽 2 / ASCII 宽 1"严格对齐;同步修复三文档数据流 ASCII 尾巴的 orphan `│` 和空行 | — |

+ 8 - 10
kb/README.md

@@ -1,12 +1,10 @@
 # poyee-data-warehouse 知识库
 
-> `kb/` 是 `poyee-data-warehouse` 数据仓库项目的权威知识库。
-> 既是**开发手册**(给人看),也是 **AI 代码生成和 Review 的参考依据**(给 AI 看)
+> `kb/` 是 `poyee-data-warehouse` 数据仓库项目的知识库。
+> 是**开发手册**,也是 **vibe coding 和 Review 的参考依据**
 
 ## 项目现状速读(冷启动必读)
 
-- **项目根目录**:`kb/` 的父目录(当前物理路径 `tendata-warehouse-release/`,重构完成后将整体更名为 `poyee-data-warehouse/`,部署目录同名)
-- **老项目 / 新项目是同一个目录**:采用**原地渐进式重构**,而不是新建空目录。目前除 `kb/` 外,根目录下所有内容(`tendata/`、`launch-pad/`、`bin/`、`publish.sh` 等)都是老项目代码,会在重构过程中逐步改造或删除
 - **`launch-pad/` 不做业务迁移**:里面是上个项目(与当前业务无关)的历史业务代码,仅作**样板 SQL / DataX ini 写法的参考**,新项目业务 SQL 全部从零开发,完成后 `launch-pad/` 整体删除
 - **`tendata/` → `dw_base/`**:这是重构核心映射,需要修改模块名 + 所有 `from tendata ...` import、`ADD FILE tendata/...`、`tendata.zip` 打包命令等引用(详见 `90-重构路线.md` §1.1)
 - **重构进度**:刚起步,kb 文档梳理完成,代码层面尚未动工。进度追踪见 `92-重构进度.md`
@@ -19,11 +17,11 @@
 
 ### 0x 项目与环境
 
-| 文档 | 内容 |
-|----|----|
+| 文档 | 内容                                               |
+|----|--------------------------------------------------|
 | [00-项目架构](00-项目架构.md) | 模块关系图、Spark SQL / DataX 执行时序、DataX 脚本详细使用说明、配置管理 |
-| [01-运行环境](01-运行环境.md) | CDH 技术栈版本、平台架构图、开发侧约束 |
-| [02-权限与账号](02-权限与账号.md) | 鉴权链路、`dolphinscheduler` vs 个人账号、DataX datasource 账号 |
+| [01-运行环境](01-运行环境.md) | CDH 技术栈版本、平台架构图、开发侧约束                            |
+| [02-权限与账号](02-权限与账号.md) | 鉴权链路、job账号 vs 个人账号
 
 ### 1x 业务上下文
 
@@ -31,6 +29,7 @@
 |----|----|
 | [10-业务流程](10-业务流程.md) | Hobby Stocks 用户侧 + 商家侧 + 售后全链路流程图 |
 | [11-数据资产](11-数据资产.md) | 业务库、埋点数据、爬虫数据、采购数据清单 |
+| [12-同步方案](12-同步方案.md) | PG → Hive 存量/增量/历史归档/CDC 同步策略与阶段演进 |
 
 ### 2x 数仓建模
 
@@ -45,8 +44,7 @@
 
 | 文档 | 内容 |
 |----|----|
-| [30-开发规范](30-开发规范.md) | 数据开发流程、任务规范、代码 / SQL 规范 |
-| [sql_style.xml](sql_style.xml) | JetBrains 系 IDE 的 SQL 代码格式化 scheme(导入方式见 `30-开发规范.md` §4.2.1) |
+| [30-开发规范](30-开发规范.md) | 数据开发流程、任务规范、代码 / SQL 规范(IDE 格式化 scheme 见 `conf/sql_style.xml`) |
 
 ### 9x 过渡资料