第1章 大数据领域建模综

1.1 为什么需要数据建模1.2 关系数据库系统和数据仓库1.3 从 OLTP 和 OLAP 系统的区别看模型方法论的选择1.4 典型的数据仓库建模方法论

1.4.1 ER 模型

1.4.2 维度模型

1.4.3 Data Vault 模型

1.4.4 Anchor 模型

1.5 阿里巴巴数据模型实践综述第2章 阿里巴巴数据整合及管理体系2.1 概述

核心:从业务架构设计(如何快速上手工作)到模型设计,从数据研发到数据服务,做到数据可管理、可追溯、可规避重复建设。

2.1.1 定位及价值

建设统一的、规范化的数据接入层( ODS )和数据中间层( DWD 和 DWS ),通过数据服务和数据产品,完成服务于阿里巴巴的大数据系 统建设,即数据公共层建设。

阿里巴巴运用的什么大数据技术(阿里大数据之路)(1)

业务板块:根据业务属性划分板块,板块之间的指标或业务重叠性较小。

规范定义:一套数据规范命名体系,用在模型设计中

模型设计:以维度建模理论为基础,基于维度建模总线架构,构建一致性的维度和事实(进行规范定义)。

2.2 规范定义

规范定义指以维度建模作为理论基础,构建总线矩阵,划分和定义 数据域、业务过程、维度、度量/原子指标、修饰类型、修饰词、时间周期、派生指标。

阿里巴巴运用的什么大数据技术(阿里大数据之路)(2)

2.2.1 名词术语

数据域(主题域)

业务过程

时间周期

修饰类型

修饰词

度量/原子指标

维度

维度属性

派生指标

2.2.2 指标体系

一、基本原则

  1. 组成体系之间的关系

阿里巴巴运用的什么大数据技术(阿里大数据之路)(3)

  1. 命名约定

阿里巴巴运用的什么大数据技术(阿里大数据之路)(4)

  1. 算法

二、操作细则

派生指标可以分为三类:事务型指标、存量型指标和复合型指标。

2.3 模型设计

2.3.1 指导理论

数据模型的维度设计主要以维度建模理论为基础,基于维度数据模型总线架构,构建一致性的维度和事实。

2.3.2 模型层次

阿里巴巴运用的什么大数据技术(阿里大数据之路)(5)

阿里巴巴通过构建全域的公共层数据,极大地控制了数据规模的增长趋势

阿里巴巴运用的什么大数据技术(阿里大数据之路)(6)

模型架构图

2.3.3 基本原则

一个逻辑或者物理模型由哪些记录和字段组成,应该遵循最基本的软件设计方法论的高内聚和低耦合原则。主要从数据业务特性和访问特性两个角度来考虑:将业务相近或者相关、粒度相同的数据设计为一个逻辑或者物理模型;将高概率同时访问的数据放一起,将低概率同时访问的数据分开存储。

建立核心模型与扩展模型体系,核心模型包括的字段支持常用的核心业务,扩展模型包括的字段支持个性化或少量应用的需要 ,不能让扩展模型的宇段过度侵入核心模型,以免破坏核心模型的架构简洁性与可维护性。

越是底层公用的处理逻辑越应该在数据调度依赖的底层进行封装与实现,不要让公用的处理逻辑暴露给应用层实现,不要让公共逻辑多处同时存在。

适当的数据冗余可换取查询和刷新性能,不宜过度冗余与数据复制。

处理逻辑不变,在不同时间多次运行数据结果确定不变。

具有相同含义的字段在不同表中的命名必须相同,必须使用规范定义中的名称。

表命名需清晰、一致,表名需易于消费者理解和使用。

2.4 模型实施

2.4.1 业界常用模型实施过程

构建维度模型一般要经历四个阶段:

2.4.2 OneData实施过程

  1. 指导方针
  1. 实施工作流

阿里巴巴运用的什么大数据技术(阿里大数据之路)(7)

(1)数据调研

  1. 业务调研:需要了解各个业务领域、业务线的业务有什么共同点和不同点 ,以及各个业务线可以细分为哪几个业务模块,每个业务模块具体的业务流程又是怎样的。业务调研是否充分,将会直接决定数据仓库 建设是否成功
  2. 需求调研:需求调研的途径有两种:一是根据与分析师、业务运营人员的沟通 (邮件、 IM )获知需求;二是对报表系统中现有的报表进行研究分析;

(2)架构设计

  1. 数据域划分

数据域是指面向业务分析,将业务过程或者维度进行抽象的集合。业务过程可以概括为 一 个个不可拆分的行为事件,如下单、支付、退款。数据域需要抽象提炼,并且长期维护和更新,但不轻易变动。

  1. 构建总线矩阵

在进行充分的业务调研和需求调研后,就要构建总线矩阵了。需要 做两件事情:明确每个数据域下有哪些业务过程;业务过程与哪些维度相关,并定义每个数据域下的业务过程和维度。

  1. 规范定义

规范定义主要定义指标体系,包括原子指标、修饰词、时间周期和 派生指标。

  1. 模型设计

模型设计主要包括维度及属性的规范定义,维表、明细事实表和汇 总事实表的模型设计。

  1. 总结

OneData 的实施过程是一个高度迭代和动态的过程, 一般采用螺旋式实施方法。在总体架构设计完成之后,开始根据数据域进行迭代式模型设计和评审。在架构设计、规范定义和模型设计等模型实施过程中, 都会引入评审机制,以确保模型实施过程的正确性。

第3章 维度设计3.1 维度设计基础

3.1.1 维度的基本概念

3.1.2 维度的基本设计方法

  1. 选择维度或新建维度。须保证维度的唯一性。
  2. 确定主维表。一般是ODS表,直接与业务系统同步。
  3. 确定相关维表。确定哪些表和主维表存在关联关系,并选择其中的某些表用于生成维度属性。
  4. 确定维度属性。第一阶段从主维表中选择维度属性或生成新的维度属性;第二阶段是从相关维表中选择维度属性或生成新的维度属性。

确认维度属性的几点提示:

  1. 尽可能生成丰富的维度属性
  2. 尽可能多地给出包括一些富有意义的文字性描述
  3. 区分数值型属性和事实
  1. 尽量沉淀出通用的维度属性

3.1.3 一致性维度和交叉探查

3.2 维度设计高级主题

3.2.1 维度整合

  1. 应用间差异:
  1. 集成类型(同维度整合):
  1. 表整合:

3.2.2 水平拆分

如何设计维度:

方案参考:

3.2.3 垂直拆分

3.2.4 历史归档

3.3 维度变化

3.3.1 缓慢变化维

在 Kimball 的理论中,有三种处理缓慢变化维的方式,可以根据业务需求来进行选择:

  1. 重写维度值。不保留历史数据, 始终取最新数据(假设业务需求方不关心历史数据,则可以采用方案1)
  2. 插入新的维度行。保留历史数据,维度值变化前的事实和过去的维度值关联,维度值变化后的事实和当前的维度值关联。
  3. 添加维度列。采用第二种处理方式不能将变化前后记录的事实归一为变化前的维度或者归一为变化后的维度(不同业务部门需要统计各自的业绩,则需 要保留历史数据)

3.3.2 快照维表

3.3.3 极限存储

  1. 透明化

阿里巴巴运用的什么大数据技术(阿里大数据之路)(8)

  1. 分月做历史拉链表

局限性:首先,其产出效率很低,大部分极限存储通常需要 t-2 ;其次,对于变化频率高的数据并不能达到节约成本的效果。

3.3.4 微型维度

阿里在实践中并未使用此技术:

3.4 特殊维度

3.4.1 递归层次

  1. 层次结构扁平化

阿里巴巴运用的什么大数据技术(阿里大数据之路)(9)

扁平化仅包含固定数量的级别,对于非平衡层次结构,可以通过预留级别的方式来解决,但扩展性较差(图为阿里巴巴中文站的类目体系,粗体部分为回填内容)

  1. 层次桥接表

阿里巴巴运用的什么大数据技术(阿里大数据之路)(10)

3.4.2 行为维度

理解为事实衍生的维度,按照加工方式划分:

对于行为维度,有两种处理方式,其中一种是将其冗余至现有的维表中,如将卖家信用等级冗余至卖家维表中另一种是加工成单独的行为维表,如卖家主营类目。具体采用哪种方式主要参考如下两个原则:

3.4.3 多值维度

多值维度的处理方式

3.4.4 多值属性

e.g. 商品和 SKU、属性、标签都是多对多的关系

多值属性的处理方式:

3.4.5 杂项维度

第4章 事实表设计4.1 事实表基础

4.1.1 事实表特性

4.1.2 事实表设计原则

原则 1:尽可能包含所有与业务过程相关的事实

原则 2:只选择与业务过程相关的事实

原则 3:分解不可加性事实为可加的组件

对于不具备可加性条件的事实,需要分解为可加的组件。比如订单的优惠率,应该分解为订单原价金额与订单优惠金额两个事实存储在事实表中。

原则 4:在选择维度和事实之前必须先声明粒度

原则 5:在同一个事实表中不能有多种不同粒度的事实

事实表中的所有事实需要与表定义的粒度保持一致,在同一个事实表中不能有多种不同粒度的事实。

阿里巴巴运用的什么大数据技术(阿里大数据之路)(11)

原则 6:事实的单位要保持一致

对于同一个事实表中事实的单位,应该保持一致。比如原订单金额、 订单优惠金额、订单运费金额这三个事实,应该采用一致的计量单位, 统 一 为元或分,以方便使用。

原则 7:对事实的 null 值要处理

对于事实表中事实度量为 null 值的处理,因为在数据 库中 null 值 对常用数字型字段的 SQL 过滤条件都不生效,比如大于、小于、等于、 大于或等于、小于或等于,建议用零值填充。

原则 8:使用退化维度提高事实表的易用性

4.1.3 事实表设计方法

对于维度模型设计采用四步设计方法:选择业务过程、声明粒度、确定维度、确定事实。

  1. 选择业务过程及确定事实表类型

在明确了业务需求以后,接下来需要进行详细的需求分析,对业务 的整个生命周期进行分析,明确关键的业务步骤,从而选择与需求有关的业务过程。

阿里巴巴运用的什么大数据技术(阿里大数据之路)(12)

业务过程通常使用行为动词表示业务执行的活动。比如图 4.1中的淘宝订单流转的业务过程有四个:创建订单、买家付款、卖家发货、买家确认收货。在明确了流程所包含的业务过程后,需要根据具体的业务需求来选择与维度建模有关的业务过程。比如是选择买家付款这个业务过程,还是选择创建订单和买家付款这两个业务过程,具体根据业务情 况来确定。

在选择了业务过程以后,相应的事实表类型也随之确定了。比如选择买家付款这个业务过程,那么事实表应为只包含买家付款这一个业务过程的单事务事实表;如果选择的是所有四个业务过程,并且需要分析各个业务过程之间的时间间隔,那么所建立的事实表应为包含了所有四个业务过程的累积快照事实表。

  1. 声明粒度

粒度的声明是事实表建模非常重要的一步,意味着精确定义事实表 的每一行所表示的业务含义,粒度传递的是与事实表度量有关的细节层次。明确的粒度能确保对事实表中行的意思的理解不会产生混淆,保证所有的事实按照同样的细节层次记录。

应该尽量选择最细级别的原子粒度,以确保事实表的应用具有最大的灵活性。同时对于订单过程而言,粒度可以被定义为最细的订单级别。比如在淘宝订单中有父子订单的概念,即一个子订单对应一种商品,如 果拍下了多种商品,则每种商品对应一个子订单:这些子订单一同结算 的话,则会生成一个父订单。那么在这个例子中,事实表的粒度应该选择为子订单级别。

  1. 确定维度

完成粒度声明以后,也就意味着确定了主键,对应的维度组合以及相关的维度字段就可以确定了,应该选择能够描述清楚业务过程所处的环境的维度信息。比如在淘宝订单付款事务事实表中,粒度为子订单,相关的维度有买家、卖家、商品、收货人信息 、业务类型、订单时间等维度。

  1. 确定事实

事实可以通过回答“过程的度量是什么”来确定。应该选择与业务 过程有关的所有事实,且事实的粒度要与所声明的事实表的粒度一致。事实有可加性、半可加性、非可加性三种类型 , 需要将不可加性事实分解为可加的组件。

比如在淘宝订单付款事务事实表中,同粒度的事实有子订单分摊的支付金额、邮费、优惠金额等。

  1. 冗余维度

在传统的维度建模的星形模型中,对维度的处理是需要单独存放在专门的维表中的,通过事实表的外键获取维度。这样做的目的是为了减少事实表的维度冗余,从而减少存储消耗。而在大数据的事实表模型设计中,考虑更多的是提高下游用户的使用效率,降低数据获取的复杂性,减少关联的表数量。所以通常事实表中会冗余方便下游用户使用的常用维度,以实现对事实表的过滤查询、控制聚合层次、排序数据以及定义主从关系等操作。

比如在淘宝订单付款事务事实表中,通常会冗余大量的常用维度字段,以及商品类目、卖家店铺等维度信息。

4.2 事务事实表

订单作为交易行为的核心载体,直观反映了交易的状况。订单的流转会产生很多业务过程,而下单、支付和成功完结三个业务过程是整个 订单的关键节点。获取这三个业务过程的笔数、金额以及转化率是日常 数据统计分析的重点,事务事实表设计可以很好地满足这个需求。本节 将介绍三种不同事务事实表的设计方式,以及在淘宝交易订单中关于邮 费和折扣分摊到子订单的算法。

4.2.1 设计过程

任何类型的事件都可以被理解为一种事务。比如交易过程中的创建 订单、买家付款,物流过程中的揽货、发货、签收,退款中的申请退 款、 申请小二介入等,都可以被理解为一种事务。事务事实表, 即针对这些过程构建的一类事实表,用以跟踪定义业务过程的个体行为,提供丰富的分析能力,作为数据仓库原子的明细数据。下面以淘宝交易事务事实表为例,阐述事务事实表的一般设计过程。

  1. 选择业务过程

图 4.1 给出了淘宝交易订单的流转过程,其中介绍了四个重要过程:创建订单、买家付款、 卖家发货、买家 确认收货,即下单、支付 、 发货和成功完结四个业务过程。这四个业务过程不仅是交易过程中的重要时间节点 ,而且也是下游统计分析的重点,因此淘宝交易事务事实表 设计着重从这四个业务过程进行展开 。

Kimball 维度建模理论认为,为了便于进行独立的分析研究,应该为每个业务过程建立一个事实表。对于是否将不同业务过程放到同一个事实表 中,将在下一节中详细介绍。

  1. 确定粒度

业务过程选定以后,就要针对每个业务过程确定一个粒度,即确定事务事实表每一行所表达的细节层次。下面先介绍淘宝订单的产生过程。

对于每一种商品产生的订单就称为子订单,子订单记录了父订单的订单号,并且有子订单标志。如果在同一个店铺只购买了一种商品,则会将父子订单进行合并,只保留一条订单记录。如图 4.2 和图 4.3 所示示例。

阿里巴巴运用的什么大数据技术(阿里大数据之路)(13)

卖家发货这个业务过程可以选择子订单粒度,即将每个子订 单作为卖家发货事实表的一个细节。然而,在实际操作中发现,卖家发货更多的是物流单粒度而非子订单粒度,同 一个子订单可以拆开成多个物流单进行发货。在事务事实表设 计过程中,秉承确定为最细粒度的原则,因此对于卖家发货确定为物流单粒度,和其他三个业务过程不同,这样可以更好地给下游统计分析带来灵活性。

  1. 确定维度

选定好业务过程并且确定粒度后,就可以确定维度信息了。在淘宝交易事务事实表设计过程中,按照经常用于统计分析的场景,确定维度包含: 买家、卖家、商品、商品类目、发货地区、收货地区、父订单维度以及杂 项维度。由于订单的属性较多,比如订单的业务类型、是否无线交易、订单的 attributes 属性等,对于这些使用较多却又无法归属到上述买卖家或商品维度中的属性,则新建一个杂项维度进行存放,如图 4.4所示。

阿里巴巴运用的什么大数据技术(阿里大数据之路)(14)

  1. 确定事实

作为过程度量的核心,事实表应该包含与其描述过程有关的所有事实。以淘宝交易事务事实表为例,选定三个业务过程一一下单、支付和 成功完结,不同的业务过程拥有不同的事实。比如在下单业务过程中, 需要包含下单金额、下单数量、下单分摊金额;在支付业务过程中,包含支付金额、分摊邮费、折扣金额、红包金额、积分金额;在完结业务过程中包含确认收货金额等。由于粒度是子订单,所以对于一些父订单上的金额需要分摊到子订单上,比如父订单邮费、父订单折扣等。

5.冗余维度

在确定维度时,包含了买卖家维度、商品维度、类目维度 、收发货维度等, Kimball维度建模理论建议在事实表中只保存这些维表的外键, 而淘宝交易事务事实表在 Kimball 维度建模基础之上做了进 一 步的优 化,将买卖家星级、标签、店铺名称、商品类型、商品特征、商品属性、 类目层级等维度属性都冗余到事实表中,提高对事实表进行过滤查询、统计聚合的效率,如图 4.5 所示 。

阿里巴巴运用的什么大数据技术(阿里大数据之路)(15)

4.2.2 单事务事实表

单事务事实表,顾名思义,即针对每个业务过程设计一个事实表。这样设计的优点不言而喻,可以方便地对每个业务过程进行独立的分析研究。1688 交易流程则采用这 种模式构建事务事实表。

1688 交易和淘宝交易相 似,主要流程也是下单、支付、发货和完结,而在这四个关键流程中 1688 交易选择下单和支付两个业务过程设 计事务事实表,分别是1688交易订单下单事务事实表和1688交易订单支付事务事实表。

选定业务过程后,将对每个业务过程确定粒度、维度和事实。对于 1688 交易订单下单事务事实表,确定子订单粒度,选择买家、卖家、商品、父订单、收货地区维度,事实包含下单分摊金额和折扣金额,如 图4.6 所示;而对于 1688 交易订单支付事务事实表 ,粒度和维度与交易订单下单事务事实表相同,所表达的事实则不 一样 ,包含支付金额、支付调整金额和支付优惠等,如图4.7 所示;

阿里巴巴运用的什么大数据技术(阿里大数据之路)(16)

1688 交易针对下单和支付分别建立单事务事实表后,每天的下单记录则进入当天的下单事务事实表中,每天的支付记录进入当天的支付事务事实表中,由于事实表具有稀疏性质 ,因此只有当天数据才会进入当天的事实表中。下面以具体交易订单为例 ,展示单事务事实表的设计实例。

阿里巴巴运用的什么大数据技术(阿里大数据之路)(17)

4.2.3 多事务事实表

多事务事实表,将不同的事实放到同一个事实表中,即同一个事实表包含不同的业务过程。多事务事实表在设计时有两种方法进行事实的处理:

如何选择:

4.2.4 两种事实表对比

  1. 业务过程

对于单事务事实表,一个业务过程建立一个事实表,只反映一个业务过程的事实 ;对于多事务事实表,在同 一个事实表 中反映多个业务过程。多个业务过程是否放到同一 个事实表中,首先需要分析不同业务过 程之间的相 似性和业务源系统。比如淘宝交易的下单、支付和成功完结 这三个业务过程是存在相似性的,都属于订单处理中的 一环,并且都来自于交易系统 ,因此适合放到同 一个事务事实表中。

  1. 粒度和维度

在考虑是采用单事务事实表还是多事务事实表时,另一个关键点就是粒度和维度,在确定好业务过程后,需要基于不同的业务过程确定粒度和维度,当不同业务过程的粒度相同,同时拥有相似的维度时,此时就可以考虑采用多事务事实表。如果粒度不同,则必定是不同的事实表。比如交易中支付和发货有不同的粒度,则无法将发货业务过程放到淘宝交易事务事实表中。

  1. 事实

对于不同的业务过程,事实往往是不同的,单事务事实表在处理事实上比较方便和灵活,仅仅体现同一个业务过程的事实即可, 而多事务事实表由于有多个业务过程, 所以有更多的事实需要处理。如果单一业务过程的事实较多,同时不同业务过程的事实又不相同,则可以考虑使 用单事务事实表,处理更加清晰 ; 若使用多事务事实表, 则会导致事实表零值或空值字段较多。

  1. 下游业务使用

单事务事实表对于下游用户而言更容易理解 , 关注哪个业务过程就使用相应的事务事实表;而多事务事实表包含多个业务过程,用户使用时往往较为困惑。1688 和淘宝交易分别采用了这两种方式,从日常使用来看,对于淘宝交易事务事实表下游用户确实有 一定的学习成本 。

  1. 计算存储成本

针对多个业务过程设计事务事实表,是采用单事务事实表还是多事务事实表,对于数据仓库的计算存储成本也是参考点之 一 ,当业务过程 数据来源于同 一个业务系统,具有相同的粒度和维度,且维度较多而事实相对不多时,此时可以考虑使用多事务事实表,不仅其加工计算成本 较低,同时在存储上也相对节省,是一种较优的处理方式。

阿里巴巴运用的什么大数据技术(阿里大数据之路)(18)

4.2.5 父子事实的处理方式

4.2.6 事实的设计准则

  1. 事实完整性:尽可能多地获取所有的度量
  2. 事实一致性:事实表中统一计算可以保证度量的一致性(比如金额由数量*单价先在事实表算出来)
  3. 事实可加性:事务事实表中关注 更多的是可加性事实,下游用户在聚合统计时更加方便
4.3 周期快照事实表

4.3.1 特性

  1. 用快照采样状态
  1. 快照粒度
  1. 密度与稀疏性
  1. 半可加性

4.3.2 实例

4.3.3 注意事项

  1. 事务与快照成对设计
  1. 附加事实
  1. 周期到日期度量
4.4 累积快照事实表

4.4.1 设计过程

4.4.2 特点

  1. 数据不断更新
  2. 多业务过程日期

4.4.3 特殊处理

  1. 非线性过程
  1. 多源过程
  1. 业务过程取舍

4.4.4 物理实现

  1. 全量表的形式:此全量表一般为日期分区表,每天的 分区存储昨天的全量数据和当天的增量数据合并的结果,保证每条记录 的状态最新。此种方式适用于全量数据较少的情况。
  2. 全量表的变化形式:比如针对交易订单,我们以 200 天作为订单从产生到消亡的最大间隔。设计最近 200 天的交易订单累积快照事实表,每天的分 区存储最近 200 天的交易订单而 200 天之前的订单则按照 gmt_create 创 建分区存储在归档表中。
  3. 业务实体的结束时间分区:每天的分区存放当天结 束的数据,设计一个时间非常大的分区,比如 3000-12-31 ,存放截至当前未结束的数据。由于每天将当天结束的数据归档至当天分区中,时间 非常大的分区数据量不会很大, ETL 性能较好;并且无存储的浪费,对于业务实体的某具体实例,在该表的全量数据中唯一。但接口等原因,存在结束标志的确认问题,有以下两个方案:
4.5 三种事实表的比较

阿里巴巴运用的什么大数据技术(阿里大数据之路)(19)

4.6 无事实的事实表

4.7 聚集型事实表DWS

4.7.1 聚集的基本原则

4.7.2 聚集的基本步骤

  1. 确定聚集维度

在原始明细模型中会存在多个描述事实的维度,如日期、商品类别、 卖家等,这时候需要确定根据什么维度聚集,如果只关心商品的交易额 情况,那么就可以根据商品维度聚集数据。

  1. 确定一致性上钻
  1. 确定聚集事实

4.7.3 阿里公共汇总层

  1. 基本原则
  1. 交易汇总表设计

4.7.4 聚集补充说明

,