使用 dbt 构建金融数据集市的完整演示,展示如何将散落在各个数据库中的"脏数据"转换为干净的业务数据集市。
演示如何使用 dbt 处理金融行业的数据:
- 📥 从多个源系统抽取数据(客户、账户、交易)
- 🔄 清洗和标准化数据(处理脏数据、不一致格式)
- 🔒 脱敏敏感信息(身份证、电话、账号)
- 📊 构建业务数据集市(客户360视图、交易分析)
# 安装 Python 3.9+
python3 --version
# 安装 dbt-sqlite
pip3 install dbt-sqlitepython3 setup_sqlite.py输出示例:
✅ 插入了 8 条客户数据(包含需要清洗的问题)
✅ 插入了 10 条账户数据(包含需要标准化的问题)
✅ 插入了 100 条交易数据(包含需要转换的问题)
📊 源数据质量问题示例:
• 姓名有多余空格(如 ' 李四 ')
• 客户类型不统一(individual / PERSON / 个人)
• 邮箱大小写混乱(LISI@EXAMPLE.COM)
• 敏感信息完全暴露(身份证号、电话号码、账号)
• 账户类型不统一(储蓄 / checking / SAVINGS / 投资)
• 交易类型中英文混杂(支付 / PAYMENT / 取款)
• 金额包含负数(-34420.08)
# 安装依赖包
dbt deps
# 运行数据处理流程
dbt run输出示例:
Found 7 models, 2 analyses, 17 data tests, 3 sources, 543 macros
1 of 7 START sql table model main_staging.stg_core_banking__customers ..... [RUN]
1 of 7 OK created sql table model main_staging.stg_core_banking__customers [OK in 0.01s]
...
7 of 7 OK created sql table model main_mart.mart_customer_360 ............. [OK in 0.01s]
Completed successfully
Done. PASS=7 WARN=0 ERROR=0 SKIP=0 NO-OP=0 TOTAL=7
python3 show_results.pydbt test输出示例:
Done. PASS=17 WARN=0 ERROR=0 SKIP=0 NO-OP=0 TOTAL=17
源数据(有问题):
customer_id customer_name customer_type id_number phone email
----------- ------------- ------------- ------------------ ------------ --------------------
CUST002 李四 PERSON 110101199002021235 13800138001 LISI@EXAMPLE.COM
CUST003 王五 个人 110101199003031236 13800138002 wangwu@example.com
❌ 问题:
- 姓名有多余空格
- 客户类型不统一(PERSON / 个人)
- 邮箱大小写混乱
- 敏感信息完全暴露
处理后数据(干净):
customer_id customer_name customer_type id_number phone email is_active
----------- ------------- ------------- ----------------- ----------- -------------------- ---------
CUST002 李四 INDIVIDUAL 110**********1235 138****8001 lisi@example.com 0
CUST003 王五 INDIVIDUAL 110**********1236 138****8002 wangwu@example.com 0
✅ 改进:
- ✓ 姓名已清洗(去除空格)
- ✓ 客户类型已标准化(统一为 INDIVIDUAL)
- ✓ 邮箱已规范化(全部小写)
- ✓ 敏感信息已脱敏(身份证保留前3后4位,电话保留前3后4位)
- ✓ 新增活跃标识字段
源数据(有问题):
account_id account_type account_number balance currency status
---------- ------------ ---------------- --------- -------- ------
ACC001 储蓄 6222000012340001 156789.5 CNY 正常
ACC002 checking 6222000012340002 45678.2 cny ACTIVE
ACC003 SAVINGS 6222000012340003 234567.8 CNY 活跃
❌ 问题:
- 账户类型中英文混杂(储蓄 / checking / SAVINGS)
- 账号完全暴露
- 币种大小写不统一(CNY / cny)
- 状态描述不统一(正常 / ACTIVE / 活跃)
处理后数据(干净):
account_id account_type account_number balance currency status is_active
---------- ------------ -------------- --------- -------- ------ ---------
ACC001 SAVINGS 0001 156789.5 CNY ACTIVE 1
ACC002 CHECKING 0002 45678.2 CNY ACTIVE 1
ACC003 SAVINGS 0003 234567.8 CNY ACTIVE 1
✅ 改进:
- ✓ 账户类型已标准化(SAVINGS / CHECKING / INVESTMENT)
- ✓ 账号已脱敏(仅显示后4位)
- ✓ 币种已统一(全部大写 CNY)
- ✓ 状态已标准化(统一为 ACTIVE / INACTIVE / FROZEN / CLOSED)
- ✓ 新增活跃标识字段
源数据(有问题):
transaction_id transaction_type amount currency status channel
-------------- ---------------- --------- -------- ------ --------
TXN00001 支付 -34420.08 Cny 处理中 手机银行
TXN00002 取款 -1300.42 Cny 成功 ONLINE
TXN00003 TRANSFER 26163.58 cny 成功 柜台
❌ 问题:
- 交易类型中英文混杂(支付 / PAYMENT / 取款)
- 金额包含负数(-34420.08)
- 币种大小写混乱(Cny / cny / CNY)
- 状态不统一(处理中 / 成功 / SUCCESS)
- 渠道名称不规范(手机银行 / ONLINE / 柜台)
处理后数据(干净):
transaction_id transaction_type amount amount_direction currency status channel is_successful
-------------- ---------------- -------- ---------------- -------- ------- ------- -------------
TXN00001 PAYMENT 34420.08 DEBIT CNY PENDING MOBILE 0
TXN00002 WITHDRAWAL 1300.42 DEBIT CNY SUCCESS ONLINE 1
TXN00003 TRANSFER 26163.58 CREDIT CNY SUCCESS BRANCH 1
✅ 改进:
- ✓ 交易类型已标准化(DEPOSIT / WITHDRAWAL / TRANSFER / PAYMENT)
- ✓ 金额转为绝对值,新增方向字段(CREDIT / DEBIT)
- ✓ 币种已统一(CNY)
- ✓ 状态已标准化(SUCCESS / PENDING / FAILED / CANCELLED)
- ✓ 渠道已标准化(MOBILE / ONLINE / ATM / BRANCH)
- ✓ 新增时间维度字段(年、月、日、星期)和成功标识
customer_id customer_name customer_type account_count balance txn_6m customer_segment ltv
----------- ------------- ------------- ------------- ------------ ------ ---------------- -----
CUST004 科技有限公司 CORPORATE 1 1,234,567.90 6 STANDARD 100.0
CUST003 王五 INDIVIDUAL 2 840,123.45 8 STANDARD 100.0
CUST001 张三 INDIVIDUAL 2 202,467.70 11 PREMIUM 87.74
💡 业务价值:
- ✓ 整合客户、账户、交易多维度数据
- ✓ 自动计算客户分群(VIP / PREMIUM / STANDARD / INACTIVE)
- ✓ 余额分级(HIGH / MEDIUM / LOW)
- ✓ 活跃度评估
- ✓ LTV(客户终身价值)评分
- ✓ 支持精准营销和客户管理
transaction_date count amount deposit withdraw mobile online
---------------- ----- ----------- ------- -------- ------ ------
2025-10-09 1 145.55 0 1 0 0
2025-10-08 1 49,814.76 0 0 0 0
2025-10-07 1 20,039.61 0 1 0 0
2025-09-30 3 54,531.58 0 1 2 1
💡 业务价值:
- ✓ 按日汇总所有交易数据
- ✓ 按交易类型分类统计
- ✓ 按渠道分析(手机银行、网银、ATM、柜台)
- ✓ 支持日常运营监控和趋势分析
源数据库(有问题的脏数据)
↓
┌─────────────────────────────────────────┐
│ Staging 层 (main_staging.db) │
│ • stg_core_banking__customers │
│ • stg_core_banking__accounts │
│ • stg_transaction_system__transactions │
│ ✓ 数据清洗、标准化、脱敏 │
└─────────────────────────────────────────┘
↓
┌─────────────────────────────────────────┐
│ Intermediate 层 (main_intermediate.db) │
│ • int_customer_accounts │
│ • int_customer_transactions │
│ ✓ 业务逻辑转换、数据聚合 │
└─────────────────────────────────────────┘
↓
┌─────────────────────────────────────────┐
│ Mart 层 (main_mart.db) │
│ • mart_customer_360 │
│ • mart_transaction_daily_summary │
│ ✓ 业务数据集市、分析视图 │
└─────────────────────────────────────────┘
finbric/
├── source_data.db # 源数据库(包含脏数据)
├── target_schemas/ # 处理后的数据库
│ ├── main_staging.db # Staging 层
│ ├── main_intermediate.db # Intermediate 层
│ └── main_mart.db # Mart 层(业务集市)
│
├── setup_sqlite.py # 生成演示数据
├── show_results.py # 展示处理结果对比
│
├── dbt_project.yml # dbt 项目配置
├── packages.yml # 依赖包配置
│
├── models/ # 数据模型(SQL)
│ ├── sources.yml # 数据源定义
│ │
│ ├── staging/ # Staging 层
│ │ ├── core_banking/
│ │ │ ├── stg_core_banking__customers.sql
│ │ │ └── stg_core_banking__accounts.sql
│ │ └── transaction_system/
│ │ └── stg_transaction_system__transactions.sql
│ │
│ ├── intermediate/ # Intermediate 层
│ │ └── customer/
│ │ ├── int_customer_accounts.sql
│ │ └── int_customer_transactions.sql
│ │
│ └── mart/ # Mart 层
│ ├── customer/
│ │ └── mart_customer_360.sql
│ └── transaction/
│ └── mart_transaction_daily_summary.sql
│
├── tests/ # 数据质量测试
│ ├── generic/ # 通用测试
│ └── mart/ # 业务测试
│
├── macros/ # SQL 宏和函数
├── analyses/ # 分析查询
└── docs/ # 项目文档
| 数据类型 | 源数据量 | 处理后 | 说明 |
|---|---|---|---|
| 客户数据 | 8 条 | 8 条 | 完成清洗、标准化、脱敏 |
| 账户数据 | 10 条 | 10 条 | 完成类型标准化、脱敏 |
| 交易数据 | 100 条 | 100 条 | 完成类型转换、金额处理 |
| 客户360视图 | - | 8 条 | 新增:整合多维度数据 |
| 交易日汇总 | - | 36 天 | 新增:按日聚合分析 |
| 数据质量测试 | - | 17/17 通过 | ✅ 全部通过 |
- 统一不同系统的字段格式
- 统一枚举值(类型、状态、渠道等)
- 统一命名规范
- 去除多余空格
- 统一大小写
- 数据格式规范化
- 身份证号:保留前3后4位
- 电话号码:保留前3后4位
- 账户号码:仅保留后4位
- 金额方向化(CREDIT/DEBIT)
- 活跃度标识
- 客户分群(VIP/PREMIUM/STANDARD)
- LTV评分计算
- 客户360度视图
- 交易日汇总分析
- 支持精准营销和运营决策
- dbt-core 1.10+ - 数据转换工具
- dbt-sqlite 1.10+ - SQLite 适配器
- SQLite 3 - 演示数据库
- Python 3.9+ - 脚本语言
- dbt_utils - dbt 工具包
# 查看源数据问题
python3 setup_sqlite.py
# 安装依赖
dbt deps
# 运行数据处理
dbt run
# 运行特定层
dbt run --select staging # 只运行 Staging 层
dbt run --select intermediate # 只运行 Intermediate 层
dbt run --select mart # 只运行 Mart 层
# 运行特定模型
dbt run --select mart_customer_360
# 查看处理结果
python3 show_results.py
# 运行数据质量测试
dbt test
# 运行特定测试
dbt test --select mart_customer_360
# 生成和查看文档
dbt docs generate
dbt docs serve
# 查看模型血缘关系
dbt docs generate
# 在浏览器中查看依赖关系图
# 清理生成文件
dbt clean项目包含 17 个数据质量测试:
- ✅ 主键唯一性测试(6个)
- ✅ 主键非空测试(6个)
- ✅ 源数据完整性测试(4个)
- ✅ 业务规则验证测试(1个)
运行 dbt test 可以验证:
- 所有主键字段非空且唯一
- 业务逻辑正确(余额非负、账户数逻辑、LTV评分范围)
- 跨表关联完整
本项目适合以下学习场景:
- 学习 dbt - 完整的 dbt 项目示例
- 数据工程 - 了解数据清洗、转换、建模流程
- 数据仓库 - 理解分层架构(Staging → Intermediate → Mart)
- 金融数据 - 了解金融行业数据处理需求
- 数据质量 - 学习数据验证和测试方法
可以基于本项目扩展:
-
添加更多数据源
- 产品系统数据
- 风控系统数据
- 客服系统数据
-
构建更多数据集市
- 产品分析集市
- 风险管理集市
- 渠道效能集市
- 营销效果集市
-
集成 BI 工具
- Metabase
- Superset
- Tableau
- Power BI
-
实施增量更新
- 修改模型为增量物化
- 添加数据分区策略
- 优化大数据处理
欢迎提交 Issue 和 Pull Request!
MIT License
🎉 开始您的数据集市之旅!
如有任何问题,请查看 演示指南 或提交 Issue。