大数据

数仓建模工具包

📎 1. 《DWD 七步法 Checklist.xlsx》

用途:指导新人从 ODS 到 DWD 表的完整建模流程
适用对象:数据开发、数仓工程师
使用方式:每建一张 DWD 表,填写一份 Checklist

步骤任务是否完成负责人交付物链接/说明
1. 划分业务域 & 明确目标与业务方对齐分析主题(如“高企资质评估”)《业务域定义.md》
定义 DWD 表用途(如“支撑资质评分、区域分布”)
2. 字段筛选使用四象限法筛选字段(高频/高质量保留)《字段筛选四象限模板.xlsx》
业务方确认保留/删除清单
3. 制定清洗 & 标准化规则逐字段制定清洗规则(空值、异常、单位)《清洗规则表.xlsx》
建立码值映射表(province、industry 等)dim_province, dim_industry
4. 设计维度退化 & 表结构识别高频维度(如 province_name)
编写 Doris 建表语句《Doris 建表语句模板.sql》
5. 编写 ETL & 测试用例编写 ETL SQL(含 Array 处理)
编写测试用例(空值、边界、异常)
6. 建立元数据 & 文档填写字段血缘、口径、负责人元数据平台录入
编写表级文档(用途、更新频率、下游)《dwd_xxx_full文档.md》
7. 上线 & 监控表结构创建
DolphinScheduler 任务配置任务名:load_dwd_xxx
配置监控告警(数据量、空值率、时效性)

📎 2. 《字段筛选四象限模板.xlsx》

用途:从 ODS 90+ 字段中科学筛选 DWD 保留字段
原则:高频 + 高质量 优先保留

Sheet1: 字段筛选清单

字段名(ODS)业务含义使用频率(高/低)数据质量(高/低)处理方式保留字段名(DWD)说明
company_name企业名称✅ 保留company_name直接保留
credit_code统一信用代码✅ 保留unified_social_credit_code标准化命名
province_raw注册省份(原始)⚠ 清洗+退化province_code, province_name映射国标+退化名称
phone联系电话⚠ 清洗后保留contact_phone标准化为11位
temp_flag临时标记❌ 删除-无业务价值
operator_id操作人工号❌ 删除-不用于分析
法人身份证号敏感信息❌ 删除或脱敏-隐私合规

Sheet2: 四象限说明

高频使用低频使用
高质量✅ 保留(核心字段)⚠ 保留(备用)
低质量⚠ 清洗后保留❌ 删除

📎 3. 《Doris 建表语句模板.sql》

适用场景:无历史分区、当前最新全量、Doris 引擎
命名规范realtime_dwd.dwd_<业务域>_<实体>_full

-- 企业基础表
CREATE TABLE realtime_dwd.dwd_company_base_full (
  company_id BIGINT COMMENT '企业ID',
  company_name STRING COMMENT '企业名称',
  unified_social_credit_code STRING COMMENT '统一社会信用代码',
  registered_capital_wan DECIMAL(10,2) COMMENT '注册资本(万元)',
  establish_date DATE COMMENT '成立日期',
  -- 退化维度
  province_code VARCHAR(10) COMMENT '注册省份编码',
  province_name STRING COMMENT '注册省份名称',
  industry_code VARCHAR(10) COMMENT '行业分类编码',
  industry_name STRING COMMENT '行业分类名称',
  -- 状态标签
  is_high_tech TINYINT COMMENT '是否高新技术企业 0/1',
  etl_time DATETIME COMMENT 'ETL时间'
) ENGINE=OLAP
UNIQUE KEY(company_id)
DISTRIBUTED BY HASH(company_id) BUCKETS 10;

-- 联系方式表(含 Array)
CREATE TABLE realtime_dwd.dwd_contact_channel_full (
  channel_id BIGINT COMMENT '联系方式ID',
  contact_id BIGINT COMMENT '联系人ID',
  company_id BIGINT COMMENT '企业ID',
  company_name STRING COMMENT '企业名称(退化)',
  contact_name STRING COMMENT '联系人名称(退化)',
  channel_type VARCHAR(20) COMMENT '方式类型:phone/email/wechat',
  channel_value STRING COMMENT '具体值',
  source_codes ARRAY<VARCHAR(10)> COMMENT '来源ID数组,如["1","3"]',
  tag_codes ARRAY<VARCHAR(20)> COMMENT '标签ID数组,如["valid","not_company"]',
  is_valid TINYINT COMMENT '是否有效(预计算)',
  is_primary TINYINT COMMENT '是否主联系方式',
  etl_time DATETIME COMMENT 'ETL时间'
) ENGINE=OLAP
UNIQUE KEY(channel_id)
DISTRIBUTED BY HASH(company_id) BUCKETS 10;

-- 索引建议(可选)
CREATE INDEX idx_tag_codes ON realtime_dwd.dwd_contact_channel_full(tag_codes) USING INVERTED;

📎 4. 《ETL 任务合并清单.md》

:将 200+ 任务 → 50 以内,串行 20 分钟完成
原则:一个任务处理多个相关表,避免重复 JOIN

# ETL 任务合并清单(高企咨询场景)

## 1. 企业相关
- **任务名**`load_dwd_company`
- **处理表**
  - `dwd_company_base_full`
- **说明**:单表,简单清洗

## 2. 联系人 + 联系方式
- **任务名**`load_dwd_contact_and_channel`
- **处理表**
  - `dwd_contact_base_full`
  - `dwd_contact_channel_full`
- **说明**
  - 先写联系人表(退化企业维度)
  - 再写联系方式表(JOIN 刚生成的联系人表)
  - 避免重复 JOIN ODS 企业表

## 3. 知识产权(专利 + 软著)
- **任务名**`load_dwd_ipr`
- **处理表**
  - `dwd_patent_full`
  - `dwd_copyright_full`
- **说明**:结构类似,合并处理

## 4. 聚合层
- **任务名**`agg_dws_company_summary`
- **处理表**
  - `dws_company_summary`
- **说明**:基于 DWD 预计算字段,无 JOIN

## 5. 画像层
- **任务名**`build_dwt_company_profile`
- **处理表**
  - `dwt_company_profile`
- **说明**:JOIN DWD + DWS 主键,无 GROUP BY

## 6. ADS 层(按需)
- **任务名**`ads_sales_company_list`
- **处理表**
  - `ads_sales_company_list`
- **说明**:JOIN DWD + DWS + DWT,拍平 Array,格式化字段

📎 5. 《ADS 表开发规范.md》

核心原则:ADS 是唯一出口,一个需求 = 一张表

# ADS 表开发规范

## 1. 命名规范
- 库名:`realtime_ads`
- 表名:`ads_<业务场景>_<主体>_<用途>`
- 示例:
  - `ads_sales_company_list`        # 销售企业清单
  - `ads_unclaimed_company_export`  # 待领取客户导出
  - `ads_contact_channel_detail`    # 联系方式明细

## 2. 字段设计原则
-**业务友好**:字段名用中文语义(如 `company_grade = 'A类客户'`
-**拍平 Array**`source_codes ARRAY``source_names_str STRING`
-**格式化布尔值**`is_valid=1``is_valid_desc='有效'`
-**宽表设计**:JOIN DWD + DWS + DWT,一次出结果
-**禁止技术字段**:如 `company_id`(除非业务需要)
-**禁止未处理 Array**:下游不会写 `LATERAL VIEW`

## 3. ETL 开发要求
- 必须从 DWD/DWS/DWT 取数,禁止直连 ODS
- 必须在 ADS 层完成最终计算(如客户等级、导出时间)
- 必须添加 `export_time DATETIME` 字段

## 4. 示例
```sql
CREATE TABLE realtime_ads.ads_sales_company_list (
  company_name STRING COMMENT '企业名称',
  industry_name STRING COMMENT '行业名称',
  total_patent_count BIGINT COMMENT '专利总数',
  company_grade STRING COMMENT '客户等级(A/B/C类)',
  export_time DATETIME COMMENT '导出时间'
);

INSERT INTO realtime_ads.ads_sales_company_list
SELECT
  dwd.company_name,
  dwd.industry_name,
  dws.total_patent_count,
  CASE
    WHEN dwt.customer_value_score > 90 THEN 'A类客户'
    WHEN dwt.customer_value_score > 70 THEN 'B类客户'
    ELSE 'C类客户'
  END AS company_grade,
  NOW() AS export_time
FROM realtime_dwd.dwd_company_base_full dwd
JOIN realtime_dws.dws_company_summary dws ON dwd.company_id = dws.company_id
JOIN realtime_dwt.dwt_company_profile dwt ON dwd.company_id = dwt.company_id;

5. 上线流程

  • 创建 ADS 表
  • 配置 DolphinScheduler 任务
  • 编写《使用说明》:字段含义、适用场景、负责人
  • 通知业务方
  • 开放 realtime_ads 库权限(按角色)