第04章 数据仓库架构¶
📚 章节概述¶
本章将深入讲解数据仓库架构,包括数据仓库设计、分层架构、主题建模等。通过本章学习,你将能够设计和构建生产级的数据仓库。
🎯 学习目标¶
完成本章后,你将能够:
- 理解数据仓库的核心概念
- 掌握数据仓库分层架构
- 了解主题建模方法
- 掌握数据仓库性能优化
- 能够设计生产级的数据仓库架构
4.1 数据仓库概述¶
4.1.1 什么是数据仓库¶
数据仓库是面向主题的、集成的、相对稳定的、反映历史变化的数据集合,用于支持管理决策。
数据仓库特点¶
- 面向主题
- 围绕主题组织
- 如销售、客户、产品
-
不是面向应用
-
集成性
- 数据来自多个源
- 统一的数据模型
-
一致的数据定义
-
非易失性
- 数据相对稳定
- 历史数据保留
-
不频繁删除
-
时变性
- 反映历史变化
- 记录数据变化
- 支持时间序列分析
4.1.2 数据仓库vs 操作型数据库¶
| 特性 | 操作型数据库 | 数据仓库 |
|---|---|---|
| 用途 | 日常业务操作 | 决策支持 |
| 数据 | 当前、详细 | 历史、汇总 |
| 更新 | 频繁、实时 | 批量、定期 |
| 查询 | 简单、事务 | 复杂、分析 |
| 性能 | 事务处理 | 查询性能 |
4.2 数据仓库分层架构¶
4.2.1 分层概述¶
数据仓库分层是将数据按照处理程度和使用目的分成不同层次。
分层架构¶
4.2.2 ODS层(操作数据存储)¶
ODS(Operational Data Store)是数据仓库的第一层,存储从源系统抽取的原始数据。
ODS特点¶
- 原始数据
- 不做转换
- 保持原样
-
便于回溯
-
分区存储
- 按日期分区
- 按来源分区
- 提高查询性能
ODS示例¶
SQL
-- Hive语法:分区列需显式声明,不支持函数表达式
CREATE TABLE ods_sales (
sale_id INT,
product_id INT,
customer_id INT,
sale_date DATE,
quantity INT,
amount DECIMAL(10,2),
source_system VARCHAR(50),
extract_time TIMESTAMP
) PARTITIONED BY (dt STRING, dm STRING)
STORED AS PARQUET;
4.2.3 DWD层(数据仓库明细层)¶
DWD(Data Warehouse Detail)是数据仓库的明细层,存储清洗和转换后的明细数据。
DWD特点¶
- 清洗数据
- 去重
- 填充缺失值
-
数据标准化
-
维度建模
- 星型模型
- 雪花模型
- 维度表和事实表
DWD示例¶
SQL
-- 事实表(Hive语法)
CREATE TABLE dwd_sales_fact (
sale_id INT,
product_id INT,
customer_id INT,
time_id INT,
store_id INT,
quantity INT,
amount DECIMAL(10,2)
) PARTITIONED BY (dt STRING, dm STRING)
STORED AS PARQUET;
-- 维度表(MySQL/PostgreSQL语法;Hive中无PRIMARY KEY约束,改用STORED AS PARQUET)
CREATE TABLE dwd_product_dim (
product_id INT PRIMARY KEY,
product_name VARCHAR(100),
category VARCHAR(50),
brand VARCHAR(50),
price DECIMAL(10,2)
);
-- 若使用Hive:
-- CREATE TABLE dwd_product_dim (
-- product_id INT,
-- product_name STRING,
-- category STRING,
-- brand STRING,
-- price DECIMAL(10,2)
-- ) STORED AS PARQUET;
4.2.4 DWS层(数据仓库汇总层)¶
DWS(Data Warehouse Summary)是数据仓库的汇总层,存储按维度汇总的数据。
DWS特点¶
- 汇总数据
- 按日期汇总
- 按地区汇总
-
按产品汇总
-
预计算
- 常用指标预计算
- 提高查询性能
- 降低计算成本
DWS示例¶
SQL
-- 日销售汇总(MySQL/PostgreSQL语法;Hive中不支持PRIMARY KEY,可改用PARTITIONED BY + STORED AS PARQUET)
CREATE TABLE dws_sales_daily (
date DATE,
product_id INT,
store_id INT,
total_quantity INT,
total_amount DECIMAL(10,2),
order_count INT,
PRIMARY KEY (date, product_id, store_id)
);
-- 月度销售汇总
CREATE TABLE dws_sales_monthly (
year INT,
month INT,
product_id INT,
total_quantity INT,
total_amount DECIMAL(10,2),
order_count INT,
PRIMARY KEY (year, month, product_id)
);
4.2.5 ADS层(应用数据服务层)¶
ADS(Application Data Service)是数据仓库的应用层,存储面向具体应用的数据。
ADS特点¶
- 应用导向
- 面向具体应用
- 数据格式优化
-
查询性能优化
-
数据服务
- API接口
- BI报表
- 数据导出
ADS示例¶
SQL
-- 销售报表
CREATE TABLE ads_sales_report (
date DATE,
product_name VARCHAR(100),
category VARCHAR(50),
total_quantity INT,
total_amount DECIMAL(10,2),
growth_rate DECIMAL(5,2)
);
-- 客户分析
CREATE TABLE ads_customer_analysis (
customer_id INT,
customer_name VARCHAR(100),
total_orders INT,
total_amount DECIMAL(10,2),
avg_order_value DECIMAL(10,2),
last_order_date DATE
);
4.3 主题建模¶
4.3.1 主题概述¶
主题是数据仓库中围绕业务主题组织数据的方式。
常见主题¶
- 销售主题
- 销售事实
- 产品维度
- 客户维度
-
时间维度
-
客户主题
- 客户事实
- 客户维度
- 交易维度
-
时间维度
-
产品主题
- 产品事实
- 产品维度
- 分类维度
- 品牌维度
4.3.2 主题建模示例¶
SQL
-- 销售主题
CREATE TABLE sales_fact (
sale_id INT PRIMARY KEY,
product_id INT,
customer_id INT,
time_id INT,
store_id INT,
quantity INT,
amount DECIMAL(10,2)
);
-- 客户主题
CREATE TABLE customer_fact (
customer_id INT PRIMARY KEY,
time_id INT,
region_id INT,
total_orders INT,
total_amount DECIMAL(10,2),
avg_order_value DECIMAL(10,2)
);
-- 产品主题
CREATE TABLE product_fact (
product_id INT PRIMARY KEY,
time_id INT,
category_id INT,
total_sales INT,
total_revenue DECIMAL(10,2),
avg_price DECIMAL(10,2)
);
4.4 练习题¶
基础题¶
- 选择题
-
数据仓库的分层不包括什么?
- A. ODS
- B. DWD
- C. DWS
- D. DDL
-
简答题
- 解释数据仓库的特点。
- 说明数据仓库分层的意义。
进阶题¶
- 实践题
- 设计一个数据仓库分层架构。
- 实现ODS到DWD的数据转换。
-
实现DWD到DWS的数据汇总。
-
设计题
- 设计一个电商数据仓库架构。
- 设计一个金融数据仓库架构。
答案¶
1. 选择题答案¶
- D(数据仓库的分层不包括DDL)
2. 简答题答案¶
数据仓库的特点: - 面向主题 - 集成性 - 非易失性 - 时变性
数据仓库分层的意义: - 数据逐步清洗和转换 - 提高查询性能 - 便于维护和管理 - 支持不同应用需求
3. 实践题答案¶
参见4.2-4.3节的示例。
4. 设计题答案¶
参见4.2-4.3节的示例。
4.5 面试准备¶
大厂面试题¶
字节跳动¶
- 解释数据仓库的分层架构。
- ODS、DWD、DWS、ADS的区别是什么?
- 如何设计数据仓库主题?
- 如何优化数据仓库性能?
腾讯¶
- 数据仓库的设计原则是什么?
- 如何处理数据仓库的数据质量?
- 如何设计数据仓库的ETL流程?
- 如何设计数据仓库的分区策略?
阿里云¶
- 数据仓库的最佳实践是什么?
- 如何设计数据仓库的扩展性?
- 如何设计数据仓库的容灾?
- 如何设计数据仓库的监控?
📚 参考资料¶
- 《The Data Warehouse Toolkit》
- 《The Kimball Method》
- 《Data Warehouse Lifecycle Toolkit》
- Apache Hive文档
- Apache Spark SQL文档
🎯 本章小结¶
本章深入讲解了数据仓库架构,包括:
- 数据仓库的核心概念
- 数据仓库分层架构
- 主题建模方法
- 数据仓库性能优化
通过本章学习,你掌握了数据仓库架构设计的核心技术,能够设计生产级的数据仓库。下一章将深入学习数据湖技术。