数仓分层架构详解2:ODS、DWD、DWS

一、ODS层(Operational Data Store)

1.1 数据同步策略

同步方式 适用场景 技术实现 延迟 数据一致性
全量同步 初始化/历史数据 DataX全量抽取、Sqoop全表导入 小时级 强一致
增量同步 每日新增数据 时间戳字段过滤(create_time 天级 最终一致
CDC同步 实时数据(订单/交易) Flink CDC、Canal、Debezium 秒级 强一致
日志同步 用户行为数据 Kafka日志采集、Flume 分钟级 最终一致

1.2 数据保留策略

  • 热数据:最近7天(直接查询)
  • 温数据:7-30天(压缩存储)
  • 冷数据:30-180天(归档存储)
  • 历史数据:180天以上(备份到对象存储)

1.3 典型表结构示例

sql 复制代码
-- 订单表(ods_order)
CREATE TABLE ods_order (
  id BIGINT COMMENT '订单ID',
  order_no STRING COMMENT '订单号',
  user_id BIGINT COMMENT '用户ID',
  amount DECIMAL(10,2) COMMENT '订单金额',
  create_time TIMESTAMP COMMENT '创建时间',
  update_time TIMESTAMP COMMENT '更新时间',
  dt STRING COMMENT '分区字段',
  op_type STRING COMMENT '操作类型(I/U/D)'
) PARTITIONED BY (dt STRING);

1.4 数据质量监控

  • 完整性:记录数波动(±10%告警)
  • 准确性:关键字段非空率(如订单ID)
  • 一致性:主外键关系(如user_id存在用户表)
  • 及时性:数据延迟(超过5分钟告警)

二、DWD层(Data Warehouse Detail)

2.1 数据清洗规则

清洗类型 规则示例 处理方式 业务影响
空值 user_id为NULL 丢弃记录/填充默认值
异常值 年龄>150或<0 丢弃记录/标记异常
重复值 同一订单多次插入 去重(保留最新)
格式 手机号非11位 丢弃/标记异常
逻辑 订单金额<0 丢弃/人工审核

2.2 维度建模技术

2.2.1 星型模型
sql 复制代码
-- 事实表(dwd_order_fact)
CREATE TABLE dwd_order_fact (
  order_id BIGINT COMMENT '订单ID',
  user_id BIGINT COMMENT '用户ID',
  product_id BIGINT COMMENT '商品ID',
  order_amount DECIMAL(10,2) COMMENT '订单金额',
  order_time TIMESTAMP COMMENT '下单时间',
  user_level STRING COMMENT '用户等级(维度退化)',
  product_category STRING COMMENT '商品类目(维度退化)'
);

-- 维度表(dim_user)
CREATE TABLE dim_user (
  user_id BIGINT COMMENT '用户ID',
  user_name STRING COMMENT '用户名',
  user_level STRING COMMENT '用户等级',
  register_time TIMESTAMP COMMENT '注册时间'
);
2.2.2 拉链表(SCD Type 2)
sql 复制代码
-- 用户维度拉链表
CREATE TABLE dim_user_zipper (
  user_id BIGINT,
  user_name STRING,
  user_level STRING,
  start_date DATE,
  end_date DATE,
  is_current BOOLEAN
);

2.3 数据标准化规范

  • 时间格式 :统一为YYYY-MM-DD HH:MM:SS
  • 金额单位:统一为元(保留2位小数)
  • 枚举值
    • 性别:M(男)、F(女)、U(未知)
    • 订单状态:1(待支付)、2(已支付)、3(已发货)
  • 编码规范
    • 地区代码:GB/T 2260
    • 行业代码:GB/T 4754

2.4 性能优化技术

  • 分区:按日期+业务线双重分区
  • 分桶:大表按user_id分桶(Join优化)
  • 压缩:使用Snappy压缩(Parquet格式)
  • 索引:构建Z-Order索引(多维查询优化)

三、DWS层(Data Warehouse Summary)

3.1 指标分层体系

层级 指标类型 示例 计算频率 使用场景
原子指标 基础指标 GMV、UV、订单量 实时 数据建模
派生指标 复合指标 客单价(GMV/订单量) 小时级 业务监控
衍生指标 趋势指标 同比(GMV/去年同期GMV-1) 天级 经营分析
计算指标 复杂指标 复购率(2次购买用户数/总用户) 周级 战略决策

3.2 宽表构建模式

3.2.1 用户行为宽表
sql 复制代码
-- dws_user_behavior_daily
CREATE TABLE dws_user_behavior_daily (
  user_id BIGINT,
  dt STRING,
  pv_count BIGINT COMMENT '页面浏览量',
  click_count BIGINT COMMENT '点击量',
  order_count BIGINT COMMENT '订单数',
  order_amount DECIMAL(10,2) COMMENT '订单金额',
  last_visit_time TIMESTAMP COMMENT '最后访问时间'
);
3.2.2 商品分析宽表
sql 复制代码
-- dws_product_analysis_daily
CREATE TABLE dws_product_analysis_daily (
  product_id BIGINT,
  dt STRING,
  sales_count BIGINT COMMENT '销量',
  sales_amount DECIMAL(10,2) COMMENT '销售额',
  uv BIGINT COMMENT '商品浏览量',
  conversion_rate DECIMAL(5,4) COMMENT '转化率',
  avg_price DECIMAL(10,2) COMMENT '平均售价'
);

3.3 数据聚合策略

聚合粒度 时间维度 业务维度 用户维度 典型表名
小时级 按小时 按品类 按会员等级 dws_sales_hourly
日级 按天 按区域 按新老客 dws_sales_daily
周级 按周 按渠道 按用户分群 dws_sales_weekly
月级 按月 按品牌 按RFM模型 dws_sales_monthly

3.4 性能优化技术

  • 预计算:提前计算Top100商品
  • 物化视图:建立常用查询的物化视图
  • 缓存:Redis缓存高频查询结果
  • 分片:大表按时间分片(如按月分表)

四、各层详细对比(扩展版)

维度 ODS层 DWD层 DWS层
数据量 100TB级(原始数据) 10TB级(清洗后数据) 1TB级(聚合数据)
存储成本 高(原始数据) 中(列存压缩) 低(聚合后数据)
查询性能 慢(全表扫描) 中(分区+分桶) 快(预计算+索引)
数据延迟 1-5分钟(CDC) 1-2小时(批处理) 1天(日批处理)
数据质量 原始质量(可能含脏数据) 高质量(清洗后) 业务可用(指标计算)
数据变更 高频(实时同步) 中频(小时级) 低频(天级)
数据血缘 源系统→ODS ODS→DWD DWD→DWS
数据治理 数据同步监控 数据质量监控 指标口径管理
典型工具 DataX、Flink CDC Spark SQL、Hive SQL Presto、ClickHouse
使用场景 数据回溯、数据重放 数据探索、数据建模 业务分析、数据服务
技术挑战 数据一致性、数据延迟 数据清洗、维度建模 指标计算、查询性能
团队分工 数据工程师 数据工程师/数据分析师 数据分析师/业务分析师
数据权限 高(敏感数据) 中(清洗后数据) 低(聚合数据)
数据生命周期 30-180天 1-3年 1-5年

五、高级实践技巧

5.1 ODS层优化

  • 数据分片:大表按业务线分片(如订单、用户、商品)
  • 数据压缩:使用ZSTD压缩(压缩比30%)
  • 数据校验:MD5校验(确保数据一致性)

5.2 DWD层优化

  • 动态清洗:根据业务规则动态调整清洗策略
  • 数据版本:保留多个版本的数据(支持回溯)
  • 数据标注:添加数据质量标签(如"高置信度")

5.3 DWS层优化

  • 指标分层:建立指标分层体系(原子→派生→衍生)
  • 指标管理:建立指标口径文档(避免口径不一致)
  • 数据服务:提供API接口(支持自助查询)

5.4 跨层优化

  • 数据血缘:建立完整的数据血缘关系
  • 数据地图:构建数据地图(支持数据发现)
  • 数据治理:建立数据治理规范(数据质量、数据安全)

六、典型数据流示例

6.1 实时数据流

复制代码
MySQL → Flink CDC → Kafka → Flink SQL → ODS → Flink SQL → DWD → Flink SQL → DWS

6.2 批处理数据流

复制代码
MySQL → DataX → HDFS → Spark SQL → ODS → Spark SQL → DWD → Spark SQL → DWS

6.3 混合数据流

复制代码
MySQL → Flink CDC → Kafka → Flink SQL → ODS → Spark SQL → DWD → Presto → DWS

七、常见问题与解决方案

7.1 ODS层问题

  • 问题:数据延迟

    • 解决方案:优化CDC配置、增加Kafka分区
  • 问题:数据不一致

    • 解决方案:增加数据校验、建立重试机制

7.2 DWD层问题

  • 问题:数据清洗规则复杂

    • 解决方案:建立清洗规则库、使用UDF
  • 问题:维度建模困难

    • 解决方案:参考Kimball维度建模理论

7.3 DWS层问题

  • 问题:指标计算慢

    • 解决方案:预计算、物化视图
  • 问题:查询性能差

    • 解决方案:优化SQL、使用索引

相关推荐
z1234567898618 小时前
2026最新两款AI编程工具深度对比实测
java·数据库·ai编程
程序猿DD18 小时前
一个 API Key,统一调用大模型、生图和联网搜索
数据库·网关
TlSfoward19 小时前
抓包代理链路下的 TLS 指纹变化分析 TLSFOWARD抓包工具
数据库·爬虫·网络协议·搜索引擎·php
数智化管理手记19 小时前
账龄分析手工统计易遗漏?自动账龄分析工具怎么搭建
大数据·网络·数据库·人工智能·数据挖掘
LabVIEW开发19 小时前
NI Package Manager安装LabVIEW时InternalServerError错误
网络·数据库·labview·labview知识·labview功能·labview程序
SelectDB19 小时前
PostgreSQL 实时同步到 Apache Doris:一站式 CDC 解决方案
数据库
ApacheSeaTunnel20 小时前
Apache SeaTunnel AI CLI Benchmark:7 款大模型、100 个 ETL 任务实测,谁真正能跑起来?
大数据·ai·开源·大模型·数据集成·cli·seatunnel·技术分享·数据同步
Database_Cool_20 小时前
AI Agent 长期记忆怎么存?阿里云 PolarDB-X 对接 Mem0 记忆框架实践
数据库·阿里云
电商API_1800790524720 小时前
企业ERP进销存场景|京东商品详情接口自动同步方案|凭证鉴权批量调用技术实操
大数据·运维·人工智能·爬虫·数据挖掘·网络爬虫
会编程的土豆20 小时前
数据库范式
数据库·oracle