数据仓库分层设计
本文首先介绍了什么是数据仓库,数据仓库有什么特点;然后介绍了如何才能设计出好的数据仓库,要基于的原则;接着介绍了数据仓库如何分层,每层的作用和意义,数据层次调用的原则;最后介绍了每层表的命名规范以及数据清洗的规范
一 数据仓库的定义
数据仓库是一个面向主题的、集成的、反映历史变化、相对稳定的数据集合,用于支持管理决策。数据仓库实际上是一种数据存储,它将各种异构数据源中的数据集成在一起,并保持其语义一致,为企业决策提供支持。总之,就是把大量数据更有逻辑的组合在一起,并且同时方便使用者和创建者进行操作和应用。
二 数据仓库的特点:
1、面向主题的
在较高层次对数据综合、归类,针对某一分析领域所抽象出来的分析对象
构建主题的3个步骤
- 抽象主题–抽象出需要分析的主题域
- 确定主题表–确定每个主题域所包含的数据表
- 选择公共键–主题的所有表都有一个公共键,作为主键的一部分,将各表统一起来,体现它是属于一个主题
2、集成的
- 数据来源的格式类型不同
- 编码、命名格式、属性单位不一致
- 对原有数据进行综合、计算
3、反映历史变化
- 数据仓库的数据是不同时间的数据集合
- 随时间变化不断增加、删除(老化)、综合数据
- 数据仓库表结构中一般都带有时间字段
4、相对稳定的
- 数据仓库的数据主要供企业决策分析之用,所涉及的数据操作主要是数据查询,一旦某个数据进入数据仓库以后,一般情况下将被长期保留,也就是数据仓库中一般有大量的查询操作,但修改和删除操作很少,通常只需要定期的加载、刷新。操作型数据库中的数据通常实时更新,数据根据需要及时发生变化。
三 数据仓库设计的原则
原则1:高内聚和低耦合
一个逻辑和物理模型由哪些记录和字段组成,应该遵循最基本的软件设计方法论的高内聚和低耦合原则。主要从数据业务特性和访问特性两个角度来考虑:将业务相近或者相关的数据、粒度相同数据设计为一个逻辑或者物理模型,将高概率同时访问的数据放一起,将低概率同时访问的数据分开存储。
原则2:核心模型与扩展模型分离
建立核心模型与扩展模型体系,核心模型包括的字段支持常用核心的业务,扩展模型包括的字段支持个性化或是少量应用的需要,必要时让核心模型与|扩展模型做关联,不能让扩展字段过度侵入核心模型,破坏了核心模型的架构简洁性与可维护性。
原则3:公共处理逻辑下沉及单一
越是底层公用的处理逻辑更应该在数据调度依赖的底层进行封装与实现,不要让公共的处理逻辑暴露给应用层实现,不要让公共逻辑在多处同时存在。
原则4:成本与性能平衡
适当的数据冗余换取查询和刷新性能,不宜过度冗余与数据复制。
原则5:数据可回滚,幂等性
处理逻辑不变,在不同时间多次运行数据结果确定不变。
原则6:一致性
相同的字段在不同表字段名相同
原则7:命名清晰可理解
表命名规范需清晰、一致,表名需易于下游理解和使用。
四 数据仓库分层
1 ODS(Operation Data Store):原始数据层
- 保存最完整的数据现场,便于一些特殊场景下的问题排查使用
- 保持数据原貌不做任何修改,起到备份数据的作用
- 数据采用压缩,减少磁盘存储空间
- 创建分区表,避免后续全表扫描
2 DWD(Data Warehouse Detail):明细数据层
- 对ODS层数据进行清洗(去除空值,脏数据,超过极限范围的数据)、维度退化、脱敏等,有利于开发效率的提升
- 使用parquet存储格式,列式存储查询效率高,具有一定的压缩,spark默认支持的存储格式,采用snappy压缩。
- 对数据进行维度建模
3 DWS(Data Warehouse Summary):汇总数据层
- 以DWD为基础,按天进行轻度汇总。冗余尽可能多的信息,对于提高下游计算的速度、减少运算数据量、简化业务逻辑、合并计算单元等具有特别大的好处。当然困难也是显而易见的,计算速度慢、数据倾斜等问题也都基本上集中在这个DWS层上。
- 是站在不同的角度去看事实表,重点关注事实表聚合后的度量值
4 ADS(Application Data Store):数据应用层
-
以DWS层为基础,按照主题进行汇总,为各种统计报表提供个性化数据,宽表集市,趋势指标。
-
尽量从单一中间层表中进行数据统计,中间层的数据一致性,就代表了最终业务数据的一致性,从而达到保证数据的一致性目的
5 DIM(Dimension):公共维度层
- 基于维度建模理论进行构建,存放维度模型中的维度表,保留一致性维度信息,降低数据计算口径和算法不一致风险
五 数据层次调用原则
ADS层应优选调用DWS或DWD层数据,不允许应用层跨过中间层从ODS层重复加工数据。
一方面,中间层团队应该积极了解应用层数据的建设需求,将公用的数据沉淀到公共层,为其他团队提供数据服务
另一方面,应用层团队也需积极配合中间层团队进行持续的数据公共建设的改造和迁移。必须避免出现过度的ODS层引用和不合理的数据复制和子集合冗余
注意:严禁开发过程出现数据逆向流转(如ADS->DWS、DWD)这种情况出现
六 数据层库分层的意义
- 把复杂问题简单化:将复杂的任务分解成多层来完成,每一层只处理简单的任务,比较简单和容易理解。
- 减少重复开发:规范数据分层,通过中间层数据,能够减少极大的重复计算,增加一次计算结果的复用性
- 隔离原始数据:不论是数据的异常还是数据的敏感性,使真实数据与统计数据解耦开
- 清晰数据结构:每一层分层都有它的作用域,这样我们在使用表的时候能更方便地定位和理解,
- 数据血缘追踪:对外提供的是能直接使用的一张业务表,但是它的来源很多,如果有一张来源表出问题了,我们希望能够快速准确地定位到问题,并清楚它的影响范围
- 保障数据质量:良好的数据模型能够改善数据统计口径的不一致性,减少数据计算错误的可能性
七 命名规范
表名需要见名知意,通过表名就可以知道它是哪个业务域,干嘛用的,什么粒度的数据
1.常规表
常规表是我们需要固化的表,是正式使用的表,是目前一段时间内需要去维护去完善的表
规范:分层前缀[dwd|dws|ads|]_业务域_主题域_XXX_粒度。
业务域、主题域我们都可以用词根的方式枚举清楚,不断完善,粒度也是同样的,主要的是时间粒度,日、月、年、周等,使用词根定义好简称。
词根
更新频率 | 命名 |
---|---|
日全量 | dd |
日增量 | di |
小时全量 | hd |
小时增量 | hi |
月全量 | md |
月增量 | mi |
周全量 | wd |
周增量 | wi |
不更新 | nd |
历史全量 | full |
2.中间表
中间表一般出现在Job中,是Job中临时存储的中间数据的表,中间表的作用域只限于当前Job执行过程中,Job一旦执行完成,该中间表的使命就完成了,是可以删除的(按照自己公司的场景自由选择,以前公司会保留几天的中间表数据,用来排查问题)
规范:table_name_staging
table_name是我们任务中目标表的名字,通常来说一个任务只有一个目标表。这里加上表名,是为了防止自由发挥的时候表名冲突,而末尾加上staging
3.临时表
临时表是临时测试的表,是临时使用一次的表,就是暂时保存下数据看看,后续一般不再使用的表,是可以随时删除的表。
规范:tmp_xxx
只要加上tmp开头即可,其他名字随意,注意tmp开头的表不要用来实际使用,只是测试验证而已。
4.维度表
维度表是基于底层数据,抽象出来的描述类的表。维度表可以自动从底层表抽象出来,也可以手工来维护。
规范:dim_xxx
维度表,统一以dim开头,后面加上,对该指标的描述,可以自由发挥。
八 清洗规格
- 单位: 比如金额统一为元
- 字段类型: 避免出现同一个字段不同的表出现不同的类型,统一定义为String
- 注释: 没有注释的字段需要及时补全,新建表的时候,一定要带上注释
- 时间格式: 如20220630,2022-06-30,2022/06/30 统一格式为2022-06-30
- 枚举值 : A表 1:男 2:女 B表 0:男 1:女 统一为 1:男 2:女
- 数据脱敏: 比如身份证号,手机号,邮箱等需要加密函数进行加密脱敏
- 空值替换:空值为null,‘null’和‘’统一为’’
更多推荐
所有评论(0)