2、数据仓库架构设计:分层架构与建模选型

大家好,我是老赵。今天咱们聊聊数据仓库的骨架——架构设计。说实话,我见过太多项目一上来就写ETL,结果三个月后表之间乱成一锅粥。嗯,架构这东西,前期想清楚,后面能省80%的坑。

2.1 分层架构:ODS、DWD、DWS、ADS

分层架构不是花架子。它解决的核心问题是:数据从源到终端,如何有序流转。我个人习惯分四层,每一层都有明确的职责。

2.1.1 ODS层(操作数据存储)

ODS是数据的第一站。说白了,就是把业务库的表原封不动拉过来。我曾经在项目中遇到一个坑:业务库字段类型是datetime,ODS层直接存成string,结果下游做时间过滤时全乱套了。所以我的原则是:ODS层只做增量/全量同步,不做任何转换

避坑指南:我曾经因为ODS层没保留源系统的删除标记,导致下游数据对不上账。后来我强制要求:ODS层必须保留源系统的所有字段,包括is_deleted、create_time、update_time。

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天登录次数等。

我的经验:DWS层不要做得太细。我见过有人把每个小时的UV都存下来,结果存储成本翻了三倍,实际查询只用天级汇总。建议只保留业务方明确需要的粒度。

2.1.4 ADS层(应用数据层)

ADS层是给报表和BI工具直接用的。这一层的数据已经高度定制化,甚至可以直接对接Excel透视表。我习惯在ADS层做两件事:宽表拉平预计算

分层 数据粒度 存储周期 典型用途
ODS 原始粒度 30天 数据回溯、审计
DWD 明细粒度 90天 自助分析、临时查询
DWS 轻度汇总 180天 常规报表、指标看板
ADS 高度汇总 永久 固定报表、大屏展示

2.2 维度建模与事实建模

建模方式决定了数据怎么组织。我个人的经验是:80%的场景用维度建模,20%的场景用事实建模。别问为什么,问就是踩过坑。

2.2.1 维度建模(星型模型)

维度建模的核心是「事实表+维度表」。事实表存度量(比如订单金额),维度表存描述(比如用户信息、商品信息)。你想想看,电商的订单分析,是不是天然适合这种模型?

核心原则:事实表尽量细粒度,维度表尽量宽表化。我见过有人把维度表拆成雪花型,结果查询要关联5张表,性能直接崩了。

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架构是「批处理+流处理」两条腿走路。批处理保证数据准确性,流处理保证低延迟。但代价是维护两套代码。我曾经在一个项目里,批处理和流处理的逻辑不一致,导致数据对不上,排查了整整两天。

避坑指南:如果你选Lambda架构,一定要确保批处理和流处理共用同一套业务逻辑代码。否则,数据不一致会让你怀疑人生。

2.3.2 Kappa架构

Kappa架构只有流处理一条路。所有数据都走消息队列,需要回溯时重新消费。好处是架构简单,坏处是消息队列的存储成本很高。我建议:如果数据量在TB级以下,Kappa很香;如果到了PB级,还是老老实实Lambda吧。

我的建议:中小公司优先选Kappa,大公司选Lambda。为什么?中小公司数据量小,Kappa的简单性可以节省人力;大公司数据量大,Lambda的批处理能有效控制成本。

2.4 知识体系总览

下面这张图是我自己总结的架构选型决策树,希望能帮你快速理清思路。

数据仓库架构选型决策树 数据仓库架构 分层架构 建模方式 ODS DWD DWS ADS 维度建模 事实建模 实时架构选型 Lambda架构 Kappa架构

嗯,以上就是数据仓库架构设计的核心内容。分层架构解决数据组织问题,维度/事实建模解决数据存储问题,Lambda/Kappa解决实时处理问题。三者结合,才能构建一个稳定、高效、可扩展的数据仓库。

最后说一句:架构设计没有标准答案。我见过用Lambda架构做得很烂的,也见过用Kappa架构跑得很顺的。关键是你得理解业务场景,然后做出最适合自己的选择。

公众号:蓝海资料掘金营,微信deep3321