数仓分层

数仓搭建的背景

  1. 需求调研与分析

    • 与业务部门、BI 团队、数据科学团队深度沟通,明确主体业务场景(营销分析、用户画像、财务报表等)。
    • 制定关键指标(KPI)、度量口径、维度定义、报表需求和数据更新频率。
  2. 数据源梳理与评估

    • 列举所有来源系统:线上业务库(MySQL、PostgreSQL)、消息队列(Kafka)、日志系统、第三方 API、文件系统(CSV/Parquet)等。
    • 评估数据质量(完整性、准确性、延迟)、容量和更新频率。
  3. 总体架构设计

    • 确定数仓部署平台:本地机房 vs 公有云 vs 混合云。
    • 选型存储与计算:例如使用 Hadoop + Hive、Spark、Flink;或云厂商的 Data Warehouse 服务(阿里云 MaxCompute、AWS Redshift、ClickHouse 等)。
    • 制定数据安全、权限管理、数据标准与元数据管理策略。
  4. 分层模型规划

    • 设计分层(见下一节),将数据抽象成多个逻辑层,逐层清洗、汇总、整合、服务化。
  5. ETL/ELT 开发

    • 编写数据抽取(Extract)、清洗(Transform)、加载(Load)作业。
    • 制定调度策略(Airflow、Oozie、Flink-CDC、Dubbo 任务等),并实现容错、重试、告警。
  6. 数据建模与存储

    • 采用星型模型(Star Schema)或雪花模型(Snowflake Schema)设计事实表和维度表。
    • 定义建模规范:主键、外键、字典表、维度缓慢变化(SCD)策略。
  7. BI/分析层对接

    • 将建好的数据集市(Data Mart)或 OLAP 表暴露给 BI 工具(Tableau、FineBI、Power BI、Superset)。
    • 优化查询性能:建立索引、分区、列存储表、聚合物化视图等。
  8. 监控与运维

    • 数据质量监控:行数校验、增量校验、异常数据抓取。
    • 作业监控:调度成功率、延迟、资源占用、告警通知。
    • 元数据管理:血缘分析、数据目录、血缘图、数据资产管理。

常见的数仓分层模型

为了使 ETL 流程清晰、职责分离,在实践中最常见的分层模型包括:

分层 英文 作用 存储/技术示例
ODS Operational Data Store 原始数据落地层,按业务系统或数据源维度进行分区存储,保留近实时的原始快照,用于排障与溯源 Kafka、HDFS、对象存储(S3/GCS/OSS)
DWD Data Warehouse Detail Layer 明细层,对 ODS 数据进行清洗、标准化、字段修正、数据补齐;形成统一的业务主题明细表 Hive/Impala、ClickHouse、Hudi、Iceberg
DWS Data Warehouse Summary Layer 汇总层,对 DWD 明细按业务维度(时间、地区、产品)进行聚合,生成常用汇总指标 ClickHouse、Doris、Spark SQL
DWM Data Warehouse Wide Table 宽表层,将汇总后的指标与维度表做宽表拼接(Kafka 可直接推宽表),为 BI 或应用提供扁平化数据接口 Kafka Topic、ClickHouse
ADS Application Data Service 应用层/分析层,面向具体的 BI 报表或数据产品,可能再做二次聚合、透视表、数据补市场景 ClickHouse、Doris、Presto、Superset

备注:有时 DWM(宽表层)和 ADS(分析层)合并为一个层级,也可根据业务复杂度和技术选型灵活调整。


各层职责与示例

1. ODS(原始数据层)

  • 职责:实时或准实时接收各系统的原始数据,保留业务系统事实表的“真相”;不做任何业务逻辑转换。

  • 示例

    -- 将 Kafka 中原始 JSON 直接写入 HDFS
    CREATE TABLE ods_user_behavior (
      `dt` Date,
      `raw_value` String
    ) ENGINE = Kafka(...);
    

2. DWD(明细层)

  • 职责:对 ODS 进行清洗、标准化、字段拆分、类型转换、缺失值补齐、维度编码等,使数据符合仓库规范。

  • 示例

    INSERT INTO dwd_user_behavior
    SELECT
      parseDateTime(raw_value, 'yyyy-MM-dd HH:mm:ss') AS event_time,
      JSONExtractUInt(raw_value, 'user_id') AS user_id,
      JSONExtractString(raw_value, 'url')       AS url,
      JSONExtractString(raw_value, 'device')    AS device
    FROM ods_user_behavior
    WHERE dt = today();
    

3. DWS(汇总层)

  • 职责:基于 DWD 对明细数据按业务维度(日期、渠道、产品)进行日/时/周/月等粒度的聚合。

  • 示例

    INSERT INTO dws_daily_pageview
    SELECT
      toDate(event_time) AS date,
      url,
      COUNT(*) AS pv,
      uniqExact(user_id) AS uv
    FROM dwd_user_behavior
    WHERE event_time >= yesterday()
    GROUP BY date, url;
    

4. DWM(宽表层)

  • 职责:将汇总指标和维度信息做宽表拼接,形成可直接用于 BI 或实时计算的扁平化表。

  • 示例

    INSERT INTO dwm_pageview_wide
    SELECT
      a.date,
      a.url,
      a.pv,
      a.uv,
      b.category_name,
      b.owner
    FROM dws_daily_pageview AS a
    LEFT JOIN dim_url_info AS b
      ON a.url = b.url;
    

5. ADS(分析层)

  • 职责:面向最终的报表、可视化、数据挖掘、机器学习等场景,对 DWM 层或 DWS 层的数据再进行二次处理。

  • 示例

    -- 在 ClickHouse 上创建物化视图,实时计算 Top10 页面
    CREATE MATERIALIZED VIEW ads_top10_pages
    ENGINE = SummingMergeTree()
    ORDER BY date AS
    SELECT date, url, sum(pv) AS total_pv
    FROM dwm_pageview_wide
    GROUP BY date, url;
    

对于 BI 场景而言,数据仓库的搭建不仅仅是“把数据放到一个地方”,而是要通过分层模型(ODS → DWD → DWS → DWM → ADS)的体系化设计,提供“标准化数据、快速查询、多维分析、高质量保障、自助化服务”的能力,帮助企业实现“以数据驱动决策”的目标。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
禁止转载,如需转载请通过简信或评论联系作者。

推荐阅读更多精彩内容