2、数据仓库架构设计:分层架构与建模选型
大家好,我是老赵。今天咱们聊聊数据仓库的骨架——架构设计。说实话,我见过太多项目一上来就写ETL,结果三个月后表之间乱成一锅粥。嗯,架构这东西,前期想清楚,后面能省80%的坑。
2.1 分层架构:ODS、DWD、DWS、ADS
分层架构不是花架子。它解决的核心问题是:数据从源到终端,如何有序流转。我个人习惯分四层,每一层都有明确的职责。
2.1.1 ODS层(操作数据存储)
ODS是数据的第一站。说白了,就是把业务库的表原封不动拉过来。我曾经在项目中遇到一个坑:业务库字段类型是datetime,ODS层直接存成string,结果下游做时间过滤时全乱套了。所以我的原则是:ODS层只做增量/全量同步,不做任何转换。
2.1.2 DWD层(明细数据层)
DWD层是数据清洗的主战场。这里要做三件事:去重、格式统一、脏数据过滤。举个例子,用户性别字段,源系统有的存"男/女",有的存"1/0",DWD层必须统一成标准编码。
-- 我常用的DWD层清洗逻辑示例
INSERT OVERWRITE TABLE dwd_user_info PARTITION(dt='2024-01-01')
SELECT
user_id,
CASE
WHEN gender IN ('男', '1', 'M') THEN 1
WHEN gender IN ('女', '0', 'F') THEN 0
ELSE -1 -- 未知性别,标记为异常
END AS gender,
-- 其他字段...
FROM ods_user_info
WHERE dt = '2024-01-01'
AND user_id IS NOT NULL; -- 过滤空值
2.1.3 DWS层(汇总数据层)
DWS层存的是宽表和轻度汇总。你想想看,如果每次报表都要扫描几亿条明细,那得等到猴年马月?DWS层就是提前算好常用的聚合指标。比如用户维度的近30天下单金额、近7天登录次数等。
2.1.4 ADS层(应用数据层)
ADS层是给报表和BI工具直接用的。这一层的数据已经高度定制化,甚至可以直接对接Excel透视表。我习惯在ADS层做两件事:宽表拉平和预计算。
| 分层 | 数据粒度 | 存储周期 | 典型用途 |
|---|---|---|---|
| ODS | 原始粒度 | 30天 | 数据回溯、审计 |
| DWD | 明细粒度 | 90天 | 自助分析、临时查询 |
| DWS | 轻度汇总 | 180天 | 常规报表、指标看板 |
| ADS | 高度汇总 | 永久 | 固定报表、大屏展示 |
2.2 维度建模与事实建模
建模方式决定了数据怎么组织。我个人的经验是:80%的场景用维度建模,20%的场景用事实建模。别问为什么,问就是踩过坑。
2.2.1 维度建模(星型模型)
维度建模的核心是「事实表+维度表」。事实表存度量(比如订单金额),维度表存描述(比如用户信息、商品信息)。你想想看,电商的订单分析,是不是天然适合这种模型?
2.2.2 事实建模(宽表模型)
事实建模就是把所有字段都塞进一张大表。适合什么场景?实时风控、实时推荐。因为这些场景需要快速读取所有特征,关联维度表太慢了。
-- 事实建模示例:实时风控特征宽表
CREATE TABLE dws_risk_feature (
user_id STRING,
device_id STRING,
ip_address STRING,
-- 近5分钟行为特征
last_5min_order_cnt INT,
last_5min_login_cnt INT,
last_5min_payment_amt DECIMAL(18,2),
-- 近1小时行为特征
last_1h_order_cnt INT,
last_1h_login_cnt INT,
-- 历史行为特征
total_order_cnt INT,
total_payment_amt DECIMAL(18,2)
) PARTITIONED BY (dt STRING);
2.3 Lambda与Kappa架构选型
说到实时数仓,绕不开这两个架构。我当年选型时也纠结了很久,后来发现:没有银弹,只有适合。
2.3.1 Lambda架构
Lambda架构是「批处理+流处理」两条腿走路。批处理保证数据准确性,流处理保证低延迟。但代价是维护两套代码。我曾经在一个项目里,批处理和流处理的逻辑不一致,导致数据对不上,排查了整整两天。
2.3.2 Kappa架构
Kappa架构只有流处理一条路。所有数据都走消息队列,需要回溯时重新消费。好处是架构简单,坏处是消息队列的存储成本很高。我建议:如果数据量在TB级以下,Kappa很香;如果到了PB级,还是老老实实Lambda吧。
2.4 知识体系总览
下面这张图是我自己总结的架构选型决策树,希望能帮你快速理清思路。
嗯,以上就是数据仓库架构设计的核心内容。分层架构解决数据组织问题,维度/事实建模解决数据存储问题,Lambda/Kappa解决实时处理问题。三者结合,才能构建一个稳定、高效、可扩展的数据仓库。
公众号:蓝海资料掘金营,微信deep3321