数据仓库的分层设计

本文详细阐述了数据仓库分层的重要性和具体层级,包括ODS、DWD、DWS和ADS层,解释了各层的功能及如何提升数据处理效率。

一、数据仓库分层的意义

1、明确数据结构
数据仓库分层后,每层完成特定的功能,易于开发管理,如果使用过程中有表数据出错,也便于定位

2、减少重复开发
规范数据分层,创建可复用的中间层数据,能够减少重复计算,提高效率

3、屏蔽原始数据
将统计数据与业务系统数据解耦,避免受业务系统变更的影响

二、数据仓库的层级

1、ODS(operation data store) 原始数据层
ODS层是贴近数据源的一层,一般是将原始数据直接载入,不进行数据清洗操作。
数据来源包括用户行为数据,如点击、浏览、分享等埋点日志数据,通常使用flume进行采集;也包含业务系统数据,如公司的交易数据,使用sqoop导入

2、DWD(data warehouse detail) 明细数据层
结构和粒度与原始表保持一致,对ODS层数据进行清洗,包括去除空值、脏数据、去除重复数据、异常值处理,也可以做局部聚合,将相同主题的数据汇总到同一张表中

3、DWS(data warehouse service) 服务数据层
该层主要加工生成宽表、中间表和维度表。
中间表:在DWD层的基础上对数据进行轻度聚合,根据不同主题或维度生成一系列中间表,以提升数据的复用性,减少重复加工
宽表:通常根据某一个维度,将不同主题的中间表拼接成一张宽表
维表:一种是商品信息、用户资料表等信息表,另一种是枚举值、编码与名称映射等配置表

4、ADS(application data store) 数据应用层
该层主要是根据具体需求指标,从DWS层中加工出结果表,可存储在Hive、ES、Redis中供数据分析和挖掘使用,也可以导出到Mysql、PostgreSql中作可视化展示使用

<think> 我们正在讨论数据仓库分层设计理念与实现方法。根据提供的引用,数据仓库分层设计主要是为了提升可维护性、组织性和效率。分层设计允许问题在特定层解决,无需影响其他层,同时在性能、成本、效率和数据质量之间取得平衡。 分层架构通常包括以下几个核心层次(参考引用[2]和[3]): - ODS(Operational Data Store):操作数据存储层,存放原始数据,接近源系统。 - DW(Data Warehouse):数据仓库层,通常细分为: - DWD(Data Warehouse Detail):明细数据层,存储清洗、转换后的明细数据。 - DWS(Data Warehouse Service):汇总数据层,存储基于明细层汇总的数据。 - DM(Data Mart) ADS(Application Data Service):应用数据层,面向特定应用数据。 - 有时还包括维层(DIM),如引用[4]所述,存储维度数据(高基数如用户/商品,低基数如配置)。 设计理念: 1. **解耦与可维护性**:各层职责单一,修改一层不影响其他层[^1]。 2. **数据一致性**:通过分层处理,确保数据从原始到汇总的转换一致。 3. **效率优化**:明细层存储细粒度数据,汇总层预聚合提升查询性能。 4. **数据质量**:在DWD层进行数据清洗,保证上层数据可靠。 实现方法(以电商订单主题为例,参考引用[3]): 1. **ODS层**:直接同步源系统的订单,保留历史变更(如每日全量/增量同步)。 2. **DWD层**: - 清洗:去除无效订单(如金额为负的订单)。 - 转换:将订单状态码转换为可读状态(如1→"已支付")。 - 维度退化:将常用维度(如商品名称、用户姓名)冗余到订单,减少关联查询。 - 分区:按日期分区存储。 3. **DWS层**: - 按维度汇总:如每日各商家的订单总数、总金额。 - 构建:创建用户订单行为(包含用户信息、订单次数、总金额等)。 4. **ADS层**: - 面向报:如生成“每日核心交易看板”数据,直接供给前端报工具。 5. **维层(DIM)**: - 高基数维度:独立存储用户、商品等维度,使用代理键。 - 低基数维度:存储枚举值映射(如订单状态字典)。 分层设计的依据(引用[2]): - 业务复杂度:简单业务可采用三层(ODS-DW-DM),复杂业务需细化分层。 - 数据量:大数据量场景需增加中间层(如DWD→DWS)预计算。 - 团队协作:分层明确后,不同团队可并行开发(如ETL团队负责DWD,数据分析团队负责ADS)。 注意事项: - 避免过度分层:每增加一层意味着ETL复杂度和存储成本上升。 - 数据血缘追踪:记录各层数据的来源和转换过程,便于问题排查。 - 一致性维度:确保跨层的维度定义统一(如使用一致的维度)。 §§相关问题§§ 1. 如何设计数据仓库数据质量监控体系? 2. 在分层架构中,如何处理缓慢变化维(SCD)? 3. 数据仓库分层设计数据中台架构有何异同? 4. 如何优化数仓分层模型以提升查询性能? </think> ### 数据仓库分层设计理念与实现方法 #### 一、核心设计理念 1. **解耦与可维护性** 分层设计确保问题在特定层解决,避免影响下层逻辑(如DWD层清洗异常数据无需修改ODS层)[^1]。 2. **性能与成本平衡** 通过分层预聚合(如DWS层汇总数据)减少重复计算,提升查询效率,降低计算成本[^1]。 3. **数据质量保障** 标准化处理流程: - ODS层保留原始数据(审计回溯) - DWD层完成数据清洗(去重/异常值处理) - DWS层保证指标一致性[^3] 4. **主题域划分** 以业务场景(如电商订单、用户行为)为单位组织数据流,避免跨主题耦合[^3]。 --- #### 二、典型分层架构(五层模型) | **层级** | **名称** | **核心职责** | **数据特征** | |----------|---------------------------|-----------------------------------------------------------------------------|----------------------------------| | ODS | 操作数据存储层 | 源系统数据镜像,保留历史变更记录 | 原始数据,分区存储 | | DWD | 明细数据层 | 数据清洗(去空值/标准化)、维度退化、事实拆分 | 明细数据,业务过程原子粒度 | | DWS | 汇总数据层 | 按主题预聚合(如用户月消费总额),构建 | 轻度汇总,维度+指标组合 | | ADS | 应用数据层 | 面向报/API的指标加工(如DAU、GMV),支持实时查询 | 高度聚合,业务可直接使用 | | DIM | 维层 | 管理高基数维度(用户资料)、低基数维度(枚举配置)[^4] | 缓慢变化,代理键机制管理 | > 🔍 **示例:电商订单主题分层实现** > - **ODS**: `ods_order`(原始订单,含未支付订单) > - **DWD**: > ```sql > CREATE TABLE dwd_order AS > SELECT order_id, user_id, cleaned_amount, -- 清洗金额异常值 > FROM_UNIXTIME(pay_time) AS pay_time -- 时间格式标准化 > FROM ods_order > WHERE status = 'paid'; -- 过滤无效订单[^3] > ``` > - **DWS**: `dws_user_monthly`(用户维度+月汇总指标) > - **ADS**: `ads_daily_gmv`(每日平台GMV报) > - **DIM**: `dim_user`(用户属性),`dim_date`(日期维) --- #### 三、分层实现关键方法 1. **数据流向控制** $$ \text{ODS} \xrightarrow{\text{清洗}} \text{DWD} \xrightarrow{\text{关联+聚合}} \text{DWS} \xrightarrow{\text{业务加工}} \text{ADS} $$ 各层仅依赖直接下层,禁止跨层引用(如ADS不可直接访问ODS)[^2]。 2. **维度建模实践** - **事实**:存储过程度量(如订单金额),位于DWD/DWS层 - **维度**:存储描述属性(如商品类目),位于DIM层 - **退化维度**:常用维度(如商品名称)冗余到事实减少关联[^3] 3. **分区与存储优化** - ODS/DWD层按时间分区(如`dt=20230101`) - DWS/ADS层按业务维度分区(如`city_id`) - 冷热数据分离:ODS存原始数据(高存储),ADS存聚合结果(低存储) 4. **统一数据血缘** 通过元数据系统追踪字段级血缘: ```mermaid graph LR A[ods_order.amount] --> B[dwd_order.cleaned_amount] B --> C[dws_user_monthly.total_spent] C --> D[ads_daily_gmv] ``` --- #### 四、不同业务场景的分层变体 | **场景** | **分层架构** | **特点** | |----------------|----------------------|------------------------------------------| | 金融风控 | ODS→BDL→FDL→GDL→ADL | 增加基础数据层(BDL)处理敏感数据脱敏 | | 实时数仓 | ODS→DWD→Stream-ADS | 用Kafka替代DWS层,直接写入ADS层实时输出 | | 超大规模数据 | ODS→DWD→DWM→DWS→ADS | 增加中间层(DWM)预聚合减少DWS计算压力 | > **选择依据**: > - 数据量级:PB级需增加中间层 > - 实时性要求:实时场景简化分层 > - 合规需求:金融场景需专用安全层[^2] --- #### 五、实施注意事项 1. **避免过度分层**:小型数仓可采用三层架构(ODS→DWD→ADS) 2. **统一命名规范**:如`{层前缀}_{业务主题}_{粒度}`(`dws_order_daily`) 3. **数据质量校验**:在各层间部署校验规则(如DWD到DWS的指标波动阈值监控)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值