数仓分层架构详解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、使用索引

相关推荐
「、皓子~2 小时前
AI创作系列35 海狸IM桌面版:本地数据库的设计艺术
数据库·golang·毕业设计·开源软件·im·社交软件
小湘西2 小时前
数仓分层架构详解:ODS、DWD、DWS
数据仓库·数据分析
YangYang9YangYan2 小时前
大数据专业就业指南
大数据
打破砂锅问到底0072 小时前
Claude--AI领域的安全优等生
大数据·人工智能·机器学习·ai
A黑桃2 小时前
Paimon Action Jar 实现机制分析
大数据·后端
谷哥的小弟2 小时前
SQLite MCP服务器安装以及客户端连接配置
服务器·数据库·人工智能·sqlite·大模型·源码·mcp
武子康2 小时前
大数据-211 逻辑回归的 Scikit-Learn 实现:max_iter、分类方式与多元回归的优化方法
大数据·后端·机器学习
lpfasd1232 小时前
鲲鹏生态下的实时计算新选择:OmniStream深度解析与竞品横向对比
大数据·flink
数说星榆1812 小时前
在线简单画泳道图工具 PC端无水印
大数据·论文阅读·人工智能·架构·流程图·论文笔记