1 思维导图&数仓常见面试题
2 题目
1. 数据仓库是什么?
数据仓库是一个面向主题的
(订单、支付、退单等)、集成的
(整合多个信息源的大量数据)、非易失的
(一般不会进行删除和修改操作)且随时间变化
(不是数据会变,而是数据量随着时间增加)的数据集合,主要用于存储历史数据,然后通过分析整理进而提供数据支持和辅助决策。
2. 数据仓库和数据库有什么区别
- 数据库中主要存放在线数据,数据仓库中主要存放历史数据,并且存放的数据量比数据库要多的多。
- 数据库主要用于业务处理(比如支付系统),数据仓库主要用于数据分析。
- 数据库的设计要避免冗余,而数据仓库通常会引入冗余,减少后面分析时的join操作。
3. 为什么要对数据仓库分层
将复杂的需求简单化
(我们通过将复杂的问题分解为多个步骤来完成,每一层只处理单一的步骤,比较容易和理解)提高数据的复用性
,比如需要中间层的数据,可以直接查询中间层的数据,不必从头开始计算。- 补充说明:数据仓库就是一种以
空间换时间
的架构
4. 为什么需要数据建模
随着数据的爆发式增长,如何对数据进行有序、有结构地分类组织和存储是一大挑战。数据建模是对数据存储和组织的一种方法,它强调从业务数据存储和使用角度合理存储数据。有了适合业务的数据模型之后,那么大数据就可以获得以下好处:性能、成本、效率、质量
5. 经典的数据仓库建模方法论有哪些
ER模型
,这个模型是符合3范式的,它的出发点就是整合数据,将各个系统中的数据按主题进行分类,但是不能直接用于分析决策。维度模型
,维度建模以数据分析作为出发点,为数据分析服务,因此它关注的重点的用户如何更快的完成需求分析以及如何实现较好的大规模复杂查询的响应性能,现在大多数数仓的搭建都是基于维度模型进行搭建的。- 区别:ER模型冗余少,在大规模数据跨表分析中,会存在多表关联,大大降低了执行效率。
6. 数仓相关的名词术语解释,比如数据域、业务过程、衍生指标
- 数据域:将业务过程或者维度进行抽象的集合,例如交易域、商品域等都是数据域。
- 业务过程:一个不可拆分的行为事件,例如下单、支付、退款等都是业务过程。
- 维度:用于分析事实所需要的环境,比如时间维度,地理维度等。
- 维度属性:维度属性属于一个维度,比如地理维度中的国家名称、身份名称都是维度属性
- 原子指标:原子指标基于某一业务过程的度量值,是业务定义中不可再拆解的指标,原子指标的核心功能就是对指标的聚合逻辑进行了定义。原子指标包含三要素,分别是
业务过程
、度量值
和聚合逻辑
。 - 派生指标:基于原子指标,其与原子指标的关系如下图所示。与原子指标不同,派生指标通常会对应实际的统计需求
- 衍生指标:衍生指标是在一个或多个派生指标的基础上,通过各种逻辑运算复合而成的。例如比率、比例等类型的指标。衍生指标也会对应实际的统计需求。
7. 派生指标的种类
- 事务型指标:对业务活动进行衡量的指标。比如订单支付金额、新发商品数、新增注册会员数。
- 存量型指标:对实体对象(比如商品、会员)某些状态的统计。
- 复合型指标:就是衍生指标
8. 经典数仓分层架构
- ODS层:把业务系统、日志等数据几乎无处理地同步到ODS层中
- 明细数据层(DWD层):该层存储维度模型的事实表
- 数据汇总层(DWS层):
- 公共维度层(DIM层):该层存储维度模型的维度表
- 应用数据层(ADS层):
9. 模型设计的基本原则
- 高内聚低耦合:将业务相关、粒度相同地数据设计为同一个物理模型,将高频率同时访问地数据放在一起,将低频率同时访问地数据分开存储。
- 核心模型于扩展模型分离:核心模型包括地字段支持常用地核心业务,扩展模型包括地字段支持个性化或少量应用的需要。
- 公共处理逻辑下沉:越是公用的处理逻辑,越应该在数据调度依赖的底层进行封装于实现,不要让公共逻辑多出同时存在。
- 成本与性能平衡:适当的数据冗余可以换取查询和刷新性能,但不要过度冗余。
- 数据可回滚:处理逻辑不变,在不同时间多次运行,数据结果确定不变。
- 一致性:具有相同含义的字段在不同的表中命名必须相同
10. 模型实施的具体步骤
数据调研
:业务调研和需求分析- 业务调研目标是
熟悉业务流程
、熟悉业务数据
,需要将该业务所包含的每个业务过程
一一列举出来。 - 需求分析需要明确需求所需的
业务过程
及维度
- 业务调研目标是
- 明确数据域: 根据业务情况进行纵向划分数据域。划分数据域的意义是
便于数据的管理和应用
。下面是电商离线数仓所需的所有业务过程及数据域划分详情
- 构建业务总线矩阵:业务总线矩阵中包含维度模型所需的所有事实(业务过程)以及维度,以及各业务过程与各维度的关系。矩阵的行是一个个业务过程,列是一个个维度,行列的交点表示业务过程与维度的关系。
一个业务过程对应一张事务型事实表,一个维度对应一张维度表。 - 明确统计指标:原子指标、派生指标、衍生指标
- 原子指标:原子指标基于某一
业务过程
的度量值
,是业务定义中不可再拆解的指标,原子指标的核心功能就是对指标的聚合逻辑
进行了定义。包含三要素:业务过程
、度量值
和聚合逻辑
。 - 派生指标:派生指标 = 原子指标 + 统计周期 + 业务限定 + 统计粒度。与原子指标不同,派生指标通常会对应实际的统计需求。
- 衍生指标:衍生指标是在一个或多个派生指标的基础上,通过各种逻辑运算复合而成的。例如比率、比例等类型的指标。衍生指标也会对应实际的统计需求。
- 原子指标:原子指标基于某一
- 维度模型设计:维度模型的设计参照上得到的业务总线矩阵即可。事实表存储在DWD层,维度表存储在DIM层。
- 汇总模型设计:汇总模型的设计参考指标体系(主要是派生指标)即可。汇总表与派生指标的对应关系是,
一张汇总
表通常包含业务过程
相同、统计周期
相同、统计粒度
相同的多个派生指标。 - 开发
- 调度
11. 维度建模有哪几种模型
-
星型模型:最常用的维度建模方式,核心就是以事实表为中心,所有的维度表直接连接在事实表上。
-
雪花模型:维度表可以再连接其他维度表,有点类似于3NF模型
12. 维度建模中表的类型
- 维度表:
一张维度表就表示对一个对象的一些描述信息
。每个维度表都包含单一的主键列,和一些对该主键的描述信息,通常维度表会很宽。 - 事实表:
一个事实表就表示对业务过程的描述
,比如下单、支付。每个事实表都包含若干个维度外键,若干退化维度(维度属性存储到事实表中,减少关联),和数值型的度量值,通常事实表都是细长(记录数多,列数少)。
13. 维度表的设计过程
维度表是维度建模的基础和灵魂。事实表围绕业务过程进行设计,维度表围绕业务过程所处的环境进行设计。维度表主要包含一个主键和各种维度字段,维度字段称为维度属性。
- 选择维度
- 确定主维表
- 确定相关维度
- 确定维度属性
14. 维度表的设计中有哪些值得注意的地方
- 尽可能生成丰富的维度属性
- 尽可能详细的对维度属性进行文字解释
- 尽量沉淀通用的维度属性
15. 维表整合的两种表现形式
- 垂直整合
- 水平整合
16. 如何处理维度的变化
维度属性通常不是静态的,而是会随时间变化的,数据仓库的一个重要特点就是反映历史的变化,所以如何保存维度的历史状态是维度设计的重要工作之一。保存维度数据的历史状态,通常有以下两种做法,分别是全量快照表和拉链表。
- 全量快照表:离线数据仓库的计算周期通常为每天一次,所以可以每天保存一份全量的维度数据。
- 优点是简单而有效,开发和维护成本低,且方便理解和使用。
- 缺点是浪费存储空间,尤其是当数据的变化比例比较低时。
- 拉链表:拉链表的意义就在于能够更加高效的保存维度信息的历史状态。
17. 事实表设计的八大原则
- 尽可能包含所有与业务过程相关的事实
- 只选择与业务过程相关的事实
- 分解不可加事实为可加事实
- 在选择维度和事实之前必须先声明粒度
- 在同一个事实表中不能有不同粒度的事实
- 事实的单位要保持一致
- 对事实的null值要处理
- 使用退化维度提高事实表的易用性
18. 事实表的设计过程
- 选择业务过程以及确定事实表类型
- 声明粒度
- 确定维度
- 确定事实:声明度量值
19. 事实表有哪几种类型
- 事务事实表:事务事实表用来记录各业务过程,它保存的是各业务过程的原子操作事件,即最细粒度的操作事件。粒度是指事实表中一行数据所表达的业务细节程度。事务型事实表可用于分析与各业务过程相关的各项统计指标
- 周期快照事实表:周期快照事实表以具有规律性的、可预见的时间间隔来记录事实,主要用于分析一些存量型(例如商品库存,账户余额)或者状态型(空气温度,行驶速度)指标。
- 累计快照事实表:累计快照事实表是基于一个业务流程中的多个关键业务过程联合处理而构建的事实表,如交易流程中的下单、支付、发货、确认收货业务过程。累积型快照事实表主要用于分析业务过程之间的时间间隔等需求。比如用户下单到支付的平均时间间隔,使用累积型快照事实表进行统计,就能避免两个事务事实表的关联操作,从而变得十分简单高效。
20. 多事务事实表如何对事务进行处理
主要有两种方法对事实进行处理
- 不同业务过程的事实使用不同的事实字段进行存放。比如淘宝交易事务事实表,表中会设置
下单度量
,支付度量
,完结度量
等字段。 - 不同业务过程的事实使用同一个事实字段进行存放,但增加一个业务过程标签。比如收藏事务事实表,表中会设置
收藏删除
类型,以及收藏删除
度量等字段。
关于上述两种方法如何选择?
- 当不同业务过程的度量比较相似时,采用第二种方式;反之,当不同业务过程的度量差异比较大时,采用第一种方式。
21. 单事务事实表和多事务事实表哪种设计更好
主要从五个方面来进行分析
- 业务过程:
- 对于单事务事实表,一个业务过程建议一张事实表,只反映一个业务过程的事实;对于多事务事实表,在同一个事实表中反映多个业务过程的事实。多个业务过程是否放到同一张事实表中,首先需要分析不同业务之间的相似性。
- 粒度和维度
- 在确定好业务过程后,需要基于不同的业务过程确定粒度和维度,当不同业务过程的粒度相同,同时拥有相似的维度时,此时就可以考虑采用多事务事实表。如果粒度不同,则必定时不同的事实表。比如交易中支付和发货有不同的粒度,则无法将发货业务过程放到淘宝交易事务事实表中。
- 事实
- 如果单一业务过程的事实较多,同时不同业务过程的事实又不相同,则可以考虑单事务事实表,处理更加清晰;若使用多事务事实表,则会导致事实表零值或空值较多。
- 下游业务使用
- 单事务事实表对于下游用户更容易理解,关注哪个业务员过程就使用哪张事实表;而多事务事实表包含多个业务过程,用户使用往往较为困惑。
- 计算存储成本
- 当业务过程来源于同一个业务系统,具有相同的粒度和维度,且维度较多而事实不多时,此时可以考虑多事务事实表,不仅加工计算成本较低,同时在存储上也相对节省。
22. 周期快照事实表的设计过程
- 确定粒度
- 周期型快照事实表的粒度可由采样周期和维度描述,故确定采样周期和维度后即可确定粒度。
- 采样周期通常选择每日。
- 维度可根据统计指标决定,例如指标为统计每个仓库中每种商品的库存,则可确定维度为仓库和商品。
- 确定完采样周期和维度后,即可确定该表粒度为每日-仓库-商品。
- 确认事实
- 事实也可根据统计指标决定,例如指标为统计每个仓库中每种商品的库存,则事实为商品库存。
23. 累计快照表的设计过程
- 选择业务过程
- 选择一个业务流程中需要关联分析的多个关键业务过程,多个业务过程对应一张累积型快照事实表。
- 声明粒度
- 精确定义每行数据表示的是什么,尽量选择最小粒度。
- 确认维度
- 选择与各业务过程相关的维度,需要注意的是,每各业务过程均需要一个日期维度。
- 确认事实
- 选择各业务过程的度量值。
24. 累计快照事实表的特点
- 数据不断更新
- 对应多业务过程日期