数仓DWD层(明细层-data warehouse detail)的构建

文章讲述了数据仓库中数据清洗和转换的过程,特别是将枚举字段汉化。事实表存储核心业务数据,而维度表提供分析视角。拉链表用于高效存储历史数据更新,节省存储空间。

总结: 这层主要是清洗、转换数据,区分事实表跟维度表构建拉链表。

(1)清洗、转换数据:一般来说是将ods层的带有 枚举 的字段进行汉化,比如 ods中有字段是 来源类型, 注释是1 为线上, 2为 线下,那么dwd层就需要把字段1跟2的换为汉字,比如说采用case 来源类型 when 1 then 线上 end, 来转换。

(2)事实表跟维度表:事实表是指其中保存了大量业务度量数据的表,是数仓最核心的表。维度表是用户来分析数据的窗口,比如时间、地区、用户等。简单的说事实表就是你要关注的内容;维度表就是你看待问题的角度;比如说你做一个销售主题,那么ods中的 订单详情表 就是事实表,而 产品分类表、区域表、店铺表就是维度表。

(3)拉链表
拉链表是为了保留看历史数据,并且使存储最为节约。比如我有100w用户,用户表记录了他们的状态,如果部分用户状态每天都有更新,我采用每天存全量用户数据的方式来记录历史和更新的状态,这样极大浪费存储空间,我用拉链表的话,每天把跟新用户的数据插入到用户表,这样既保留了历史数据,并且使存储最为节约。

<think>首先,用户的问题是:“我想确定中拉链表的合理建模级 请问库中拉链表应该在DWD还是DWS创建”。我需要基于提供的引用来回答。 回顾引用: - 引用[1]:描述了(DW),包括ODS、DW等,DW按主题建立据模型,保存历史据。 - 引用[2]:讨论了DWD库细节),包括拉链表讲解和JOIN优化。提到DWB(可能是个笔误,可能指DWS)需要降维和汇总。 - 引用[3]:关于DWD搭建,具体到dwd_dim_date_info表的例子。 - 引用[4]:关于据库索引的创建,似乎与问题无关。 用户的问题是关于拉链表应该在DWD还是DWS创建。拉链表是一种处理缓慢变化维度的技术,用于存储历史变化据。 在库的分中: - **DWDData Warehouse Detail)**:通常是明细,存储原子事实和维度表,包括拉链表等处理历史变化的据。 - **DWSData Warehouse Service/Summary)**:通常是汇总,用于聚合据,支持报表和分析。 从引用[2]中,它说:“关于DWD的讲解和拉链表讲解”,这表明拉链表通常是在DWD创建的。引用[2]还提到DWB(可能指DWS)需要降维和汇总,所以拉链表这种细节历史据应放在DWD。 引用[3]也讨论了DWD,包括dwd_dim_date_info表,这是一个日期维度表,可能使用了拉链表技术。 因此,基于这些引用,拉链表应该在DWD创建。 我的回答应该: - 结构清晰,逐步解决问题。 - 使用中文。 - 在行内学表达式使用$...$,独立公式使用$$...$$。 - 生成相关问题。 - 在引用末尾添加引用标识,如[^1]。 回答结构: 1. 解释拉链表的概念。 2. 分析DWD和DWS的区别。 3. 基于引用,说明拉链表应在DWD创建。 4. 给出理由。 5. 生成相关问题。 确保回答真实可靠,基于提供的引用。</think>### 拉链表在库中的建模级分析 在库(Data Warehouse)架构中,拉链表(Slowly Changing Dimension, SCD Type 2)是一种处理缓慢变化维度(如用户信息、产品属性等)的技术,它通过记录历史变化(如生效日期和失效日期)来保留据的完整历史轨迹。合理建模级的选择直接影响据存储效率、查询性能和后续分析。基于库标准分(如ODS、DWD、DWS等),我将逐步分析拉链表应放置在DWD还是DWS。 #### 步骤1: 理解DWD和DWS的核心职责 - **DWDData Warehouse Detail库细节)**: 此存储原子级别的明细据,包括原始事实表、维度表及其历史变化。DWD的主要职责是: - 清洗和整合ODS据。 - 实现据模型(如星型模型或雪花模型),并处理历史变化(例如拉链表)。 - 保留完整的历史据,支持细粒度查询。 引用[2]明确指出:“关于DWD的讲解和拉链表讲解”,这暗示拉链表是DWD的核心组成部分,因为它需要记录维度变化的明细历史据。引用[3]也通过示例(如`dwd_dim_date_info`表的创建)展示了DWD如何存储维度表,并强调了据格式优化(如列式存储和压缩)。 - **DWSData Warehouse Service/Summary,库服务/汇总)**: 此基于DWD进行聚合和汇总,生成面向主题的宽表或指标据。DWS的主要职责是: - 降维和汇总据(例如,将多个维度表合并为宽表)。 - 优化查询性能,支持BI报表和OLAP分析。 引用[2]提到:“在做关于DWB时我们需要降维...所以在这里我们需要join一些表”,这里DWB可能指DWS(常见笔误),强调其汇总特性。汇总通常不存储原始历史变化,而是基于DWD据计算衍生指标。 #### 步骤2: 确定拉链表的合理级 基于上述职责划分,**拉链表应在DWD创建**,理由如下: 1. **历史据完整性**: 拉链表的核心是记录维度的历史变化(如用户地址变更),这需要原子级别的明细存储。DWD专为保存完整历史据设计(引用[1]:“排除对决策无用的据,提供特定主题的简明视图...在DW会保存BI系统中所有的历史据”),而DWS更关注聚合据,不适合存储原始变化轨迹。 2. **建模一致性**: 拉链表本质上是维度表的一种实现方式(如SCD Type 2),属于库的细节。引用[2]和[3]都将拉链表与DWD关联,例如引用[2]在讨论DWD时直接讲解拉链表,并强调JOIN优化(如避免据倾斜),这符合DWD处理明细据的场景。引用[3]的`dwd_dim_date_info`表示例也展示了DWD如何存储维度表(包括日期维度),这与拉链表的技术目标一致。 3. **性能和维护考虑**: - DWD存储拉链表后,DWS可以基于此进行高效汇总(如生成每日快照表),避免在汇总重复处理历史变化。 - 在DWS创建拉链表会导致冗余和复杂性:DWS本应轻量,若存储历史变化,会增加据冗余和ETL负担(引用[2]:“所有优化的前提都是要有资源的”)。 - 拉链表需要频繁更新(如插入新记录表示变更),DWD更适合此类操作,而DWS更侧重只读查询。 #### 结论 在库架构中,**拉链表应创建在DWDData Warehouse Detail)**,因为它处理原子级别的历史变化据,与DWD的职责(清洗、整合、存储明细)高度匹配。DWS则用于基于DWD构建汇总表,不适合直接存储拉链表。这种分确保了据模型的可维护性、查询效率和资源优化。 #### 示例说明 假设一个用户维度表,在DWD建模为拉链表: ```sql -- DWD创建拉链表(例如:dwd_dim_user) CREATE TABLE dwd_dim_user ( user_id BIGINT, name STRING, address STRING, start_date DATE, -- 生效日期 end_date DATE, -- 失效日期 is_current BOOLEAN ) STORED AS ORC TBLPROPERTIES ("orc.compress"="SNAPPY"); ``` 此表记录用户地址的每次变更(如用户ID=1001在2023-01-01生效,2023-12-31失效)。在DWS,则基于此表生成汇总视图(如用户当前状态表)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值