#yyds干货盘点#基于 OneData 的数据仓库方法论

天下之事常成于困约,而败于奢靡。这篇文章主要讲述#yyds干货盘点#基于 OneData 的数据仓库方法论相关的知识,希望能为你提供帮助。
OneData 是阿里巴巴内部进行数据整合和管理方法体系和工具。
指导思想首先,要进行充分的业务调研和需求分析。
其次,进行数据总体架构设计,主要是根据数据域对数据进行划分;按照维度建模理论,构建总线矩阵,抽象出业务过程和维度。
再次,对报表需求进行抽象整理出相关指标体系,使用 OneData 工具完成指标规范定义和模型设计。 最后,是代码研发和运维。
其实施流程主要分为:数据调研、架构设计、规范定义和模型设计。

#yyds干货盘点#基于 OneData 的数据仓库方法论

文章图片

?
数据调研 业务调研
需要确认要规划进数仓的业务领域,以及各业务领域包含的功能模块,以阿里的业务为例,可规划如下矩阵:
#yyds干货盘点#基于 OneData 的数据仓库方法论

文章图片

?
需求调研
了解需求方关系哪些指标?需要哪些维度、度量?数据是否沉淀到汇总层等到。
#yyds干货盘点#基于 OneData 的数据仓库方法论

文章图片

?
架构设计 数据域的划分
数据域是将业务过程或者维度进行抽象的集合,一般数据域和应用系统(功能模块)有联系,可以考虑将同一个功能模块系统的业务过程划分到一个数据域:
#yyds干货盘点#基于 OneData 的数据仓库方法论

文章图片

?
#yyds干货盘点#基于 OneData 的数据仓库方法论

文章图片

?
构建总线矩阵
在进行充分的业务调研和需求调研后,就要构建总线矩阵了,需要做两件事情:
  1. 明确每个数据域下有哪些业务过程。
  2. 业务过程与哪些维度相关,并通过总线矩阵定义每个数据域下的业务过程和维度:
#yyds干货盘点#基于 OneData 的数据仓库方法论

文章图片

?
指标体系搭建 基本概念
数据域:指面向业务分析,将业务过程或者维度进行抽象的集合。
业务过程:指企业的业务活动中的事件。
时间周期:用来明确数据统计的事件范围或者时间点,如近 30 天、截至当前。
修饰类型:对修饰词的一种抽象划分。
修饰词:指除统计维度外指标的业务场景限定抽象。抽象词隶属于一种抽象类型,如访问终端类型下的 pc、安卓、苹果。
度量/原子指标:具有明确含义的业务名词。如:支付金额。
维度:维度是度量的环境,用来反应业务的一类属性,这类属性的集合称为一个维度,也可以称为实体对象,如地理维度、时间维度。
维度属性:对维度的描述,隶属于一个维度。如:地理维度下的国家、省份。
派生指标:原子指标+多个修饰词(可选)+时间周期。
明确原子指标、修饰词、时间周期和派生指标的定义。
#yyds干货盘点#基于 OneData 的数据仓库方法论

文章图片

?
操作细则
派生指标来源于三类指标:事务型指标、存量型指标和复合型指标。
事务型指标:指对业务活动进行衡量的指标。
存量型指标:指对实体对象某些状态的统计。
复合型指标,在上述两种指标基础上复合而成的。
#yyds干货盘点#基于 OneData 的数据仓库方法论

文章图片

?
模型设计 数据分层
业界对数仓分层的看法大同小异,大体上认为分为接入层、中间层和应用层三层,不过对中间层的理解有些差异。
#yyds干货盘点#基于 OneData 的数据仓库方法论

文章图片

?
接入层(ods)
业务数据一般是采用 dataX 或者 sqoop 等以固定频率同步到数仓中构建 ODS 层;
如果是日志数据则通过 flume 或者 Kafka 等同步到数仓中。
接入层一般不会对源数据做任何处理、清洗,便于之后回溯。
明细层(dwd)
理论上明细层数据是对 ods 层数据进行清洗加工,提高 ods 层数据的可用性,对于 dwd 层数据是否同层引用的观点需要权衡:
  1. 一般情况下 dwd 层不建议同层引用,这样做可以减少明细层任务之间的依赖,减少节点深度。
  2. 但是在某些场景下,ods 层到 dwd 层数据加工逻辑复杂,计算开销大,这时可以权衡考虑适当复用 dwd 表来构建新的 dwd 表。
汇总层(dws)
这一层依赖我们的指标体系,将 dwd 层的数据按照各个维度进行聚合计算。
数据集市层(dwm)
当我们有一些跨业务域的聚合统计需求时,放到这一层。
应用层(app)
这一层主要针对汇总层,进行相关指标的组合,生成报表。
维度设计维度建模中,将度量称为事实,维度用于分析事实所需要的多样环境。维度的作用一般是查询、分类汇总以及排序。
通过报表的约束条件,以及之前数据调研和业务方的沟通,我们可以获得维度。
维度通过主键与事实表进行关联,维度表的主键分为代理键和自然键两种;代理键不具有业务含义,一般用于处理缓慢变化维度,自然键则具有业务含义。
维度设计基本方法
  1. 选择或者新建一个维度,通过之前总线矩阵的构建掌握了目前数仓架构中的维度。
  2. 确定主维表。此处主维表一般是 ODS 表,直接与业务系统同步。
  3. 确定相关维表。数仓是业务源系统的数据整合,不同业务系统或者同一业务系统中的表之间存在关联性。跟据对业务的梳理,我们可以确认哪些表和主维表存在关联关系,并选择其中的某些表用于生成维度属性。
  4. 确定维度属性。本步骤分为两阶段,第一阶段是从主维表中选择维度属性或生成新的维度属性;第二阶段是从相关维表中选择维度属性或生成新的维度属性。
规范化和反规范化
当具有多层次的维度属性,按照第三范式进行规范化后形成一系列维度表,而非单一维度表,这种建模称为雪花模式。
将维度的属性层次合并到单个维度中的操作称为反规范化。
一致性维度和交叉探查
我们存在很多需求是对于不同数据域的业务过程或同一数据域的不同业务过程合并在一起观察。例如:对于日志数据域统计商品维度的近一天 PV 和 UV;对于交易数据域统计商品维度近一天的 GMV。
这种将不同数据域的商品事实合并在一起进行数据探查,称为交叉探查。
数仓能进行交叉探查的前提是,不同数据域要具有一致性维度。
维度整合
由于数仓的数据源来源于不同的应用系统,应用系统之间相互独立,因此对同一信息的描述、存储都可能具有差异。
而这些具有差异的数据进入数仓后需要整合在一起:
  1. 命名规范的统一。表名、字段名等统一。
  2. 字段类型的统一。相同和相似字段的字段类型统一。
  3. 公共代码以及代码值的统一。
  4. 业务含义相同的表的统一。主要依据高内聚、低耦合的理念,将业务关系大,源系统影响差异小的表进行整合。
表级别的整合主要有两种形式:
垂直整合,即不同来源表包含相同的数据集,只是存储的信息不同,可以整合到同一个维度模型中。
水平整合,即不同来源表包含不同的数据集,这些子集之间无交叉或存在部分交叉,如果有交叉则去重;如果无交叉,考虑不同子集的自然键是否冲突,不冲突则可以将各子集自然键作为整合后的自然键,或者将各自然键加工成一个超自然键。
拉链表
拉链表,又称为极限存储技术。假设某一张表是用来存储全量用户信息的,一般我们的处理方式是,用每个分区去存储每天全量数据的快照,这种方式的问题是,如果我希望保存用户的所有历史状态,我可能需要永久保存每一个历史分区。
如果使用拉链表,每个分区可以保存每个用户在当天的历史状态,同时历史分区也可以进行清理。
这样,虽然单个分区中存储的数据变多了,但是某些历史分区的数据被清理后,整个表存储的数据会变少了,因为很多没有变化的用户信息快照被清理了。
微型维度
微型维度的创建是通过将一部分不稳定的属性从相对稳定的主维度中移除,放置到拥有自己代理键的新表来实现。
递归层次
递归层次指的是某维表的实例值的层次关系,维度的递归层次分为有固定数量级别的均衡层次结构和无固定数量级别的非均衡层次结构。
由于数仓中一般不支持递归 SQL 的功能来处理这种层次结构,所以需要用到其他方式。
  1. 层次结构扁平化,适合均衡层次结构维度。
  2. 层次桥接表,适合非均衡层次结构维度。
#yyds干货盘点#基于 OneData 的数据仓库方法论

文章图片

?
多值维度
多值维度指事实表的一条记录在某维度表中有多条记录与之对应。
针对多值维度,常见的处理方式有三种:
  1. 降低事实表的粒度。
  2. 列扩展。
  3. 较为通用的方式,采用桥接表。
杂项维度
杂项维度是由操作型系统中的指示符或者标志字段组合而成,一般不在一致性维度之列。
这些维度如果作为事实存在事实表中,则会导致事实表占用空间变大;如果单独建立维表,则会出现许多零碎的小维表。
这时,通常的解决方案是建立杂项维度,将这些字段建立到一个维表中,在事实表中只需保存一个外键即可,杂项维度可以理解为将许多小维表通过行转列的方式存储到一张大维表中的处理方案。
退化维度
【#yyds干货盘点#基于 OneData 的数据仓库方法论】指维度属性直接存储到事实表中的维度。
参考文档:
  1. 美团数据平台及数仓建设实践,超十万字总结
  2. 五万字 | 耗时一个月整理出这份Hadoop吐血宝典

    推荐阅读