❤️ 爆肝三万字《数据仓库体系》轻松拿下字节offer ❤️建议收藏
Posted 不吃西红柿丶
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了❤️ 爆肝三万字《数据仓库体系》轻松拿下字节offer ❤️建议收藏相关的知识,希望对你有一定的参考价值。
🍅 作者主页:不吃西红柿
🍅 简介:CSDN博客专家🏆、信息技术智库公号作者✌ 华为云享专家、HDZ核心组成员。 简历模板、PPT模板、学习资料、面试题库、技术互助,点击下方「信息技术智库」跳转文末都给你!
目录
文章很长,前言一定要看
拥有本篇文章,意味着你拥有一本完善的书籍,本篇文章整理了数据仓库领域,几乎所有的知识点,文章内容主要来源于以下几个方面:
- 源于「数据仓库交流群」资深数据仓库工程师的交流讨论,如《sql行转列的千种写法》。
- 源于群友面试大厂遇到的面试真题,整理投稿给我,形成《面试题库》。
- 源于笔者在系统学习过程中整理的笔记和一点理解。
- 源于技术网站的优质文章和高赞答案。
本篇文章尤其适合初级程序员准备面试,以及作为工作中的指导手册,对资深程序员来说也可夯实基础。
当然,技术学习仅仅依靠一篇文章还是不够的,可加入公众号和技术交流群(联系方式见文末),群里有很多数据仓库领域资深大佬,大家经常在群里讨论技术热点问题、互相解决工作难题、安排内推、甚至有部门leader直接发出岗位邀请。「西红柿🍅」也会持续更新优质文章,也欢迎热爱学习总结的小伙伴有偿投稿,共同推动中国信息技术行业发展,让我们一起加油吧!
目录
一、数据仓库的8个发展阶段
1.概念阶段(1978-1988)
2.萌芽阶段
3.集成阶段
4.确立阶段(1991)
5.数据集市(1994-1996)
6.争吵与混乱(1996-1997)
7.合并(1998-2001)
8.未来
二、四种常见数据模型
1.为什么要进行数据仓库建模
2.四种常见模型
2.1 维度模型
2.1.1 星型模型
2.1.2 雪花模型
2.1.3 星座模型
2.2 范式模型
2.3 Data Vault模型
2.4 Anchor模型
3.数据模型的评价标准
三、三种事实表(设计原则,设计方法)
1.三种事实表概述
2.三种事实表对比
3.事实表设计 8 大原则
4.事实表设计方法
第一步:选择业务过程及确定事实表类型
第二步:声明粒度
第三步:确定维度
第四步:确定事实
四、多维体系结构
1.总线架构
2.一致性维度
3.一致性事实
4.小编有话
五、数据仓库规范设计
1.为什么要进行规范设计
2.设计规范 - 指标
3.命名规范 - 表命名
3.1 常规表
3.2 中间表
3.3 临时表
3.4 维度表
4.开发规范
5.流程规范
六、元数据管理
1.业务元数据
2.技术元数据
3.管理元数据
4.小编有话
七、维度表
1.什么是维度表
2.维度表设计原则
3.维度表设计方法
八、三范式与反范式
1.第一范式
2.第二范式
3.第三范式
4.反范式化
5.范式化设计和反范式化设计的优缺点
5.1 范式化 (时间换空间)
5.2 反范式化(空间换时间)
6.OLAP和OLTP中如何设计范式
九、数据仓库架构-Lambda和Kappa
1.Lambda架构原理
2.Lambda架构的缺点
3.Kappa架构原理
4.Lambda架构和Kappa架构优缺点对比
5.数据架构评价标准
6.小编有话
十、数据治理(目的、方法、流程)
1.什么是数据治理
2.数据治理的目的
3.数据治理的方法
4.数据质量8个衡量标准
5.数据治理流程
十一、ETL
1.什么是ETL
2.ETL & ELT
3.常用的ETL工具
3.1 sqoop
3.2 DataX
3.3 Kettle
3.4 canal
十二、数据应用-OLAP
1.OLAP和OLTP的区别
2.OLAP分类
3.OLAP基本操作
4.OLAP选型
十三、数据倾斜
1.数据倾斜表现
1.1 hadoop中的数据倾斜表现
1.2 hive中数据倾斜
1.3 Spark中的数据倾斜
2.数据倾斜产生原因
3.解决数据倾斜思路
2.1 业务逻辑
2.2 程序层面
2.3 调参方面
2.4 从业务和数据上解决
一、数据仓库的8个发展阶段
1、概念阶段(1978-1988)
数据仓库最早的概念可以追溯到20世纪70年代MIT的一项研究,该研究致力于开发一种优化的技术架构并提出这些架构的指导性意见。
第一次,MIT的研究员将业务系统和分析系统分开,将业务处理和分析处理分成不同的层次,并采用单独的数据存储和完全不同的设计准则。同时,MIT的研究成果与80年代提出的信息中心(InformationCenter)相吻合:即把那些新出现的、不可以预测的、但是大量存在的分析型的负载从业务处理系统中剥离出来。
但是限于当时的信息处理和数据存储能力,该研究只是确立了一个论点:这两种信息处理的方式差别如此之大,以至于它们只能采用完全不同的架构和设计方法。
2、萌芽阶段
在80年代中后期,作为当时技术最先进的公司,DEC已经开始采用分布式网络架构来支持其业务应用,并且DEC公司首先将业务系统移植到其自身的RDBMS产品:RdB。并且,DEC公司从工程部、销售部、财务部以及信息技术部抽调了不同的人员组建了新的小组,不仅研究新的分析系统架构,并要求将其应用到其全球的财务系统中。该小组结合MIT的研究结论,建立了TA2(TechnicalArchitecture2)规范,该规范定义了分析系统的四个组成部分:
- 数据获取
- 数据访问
- 目录
- 用户服务
其中的数据获取和数据访问目前大家都很清楚,而目录服务是用于帮助用户在网络中找到他们想要的信息,类似于业务元数据管理;用户服务用以支持对数据的直接交互,包含了其他服务的所有人机交互界面,这是系统架构的一个非常大的转变,第一次将交互界面作为单独的组件提出来。
3、集成阶段
全企业集成(EnterpriseIntergration,1988)同时,IBM也在处理信息管理不同方面的问题,其最烦人的问题是不断增加的信息孤岛,IBM的很多客户要面对很多分立系统的数据集成问题,而这些系统有不同的编码方式和数据格式。
1988年,为解决全企业集成问题,IBM爱尔兰公司的BarryDevlin和PaulMurphy第一次提出了“信息仓库(InformationWarehouse)”的概念,将其定义为:“一个结构化的环境,能支持最终用户管理其全部的业务,并支持信息技术部门保证数据质量”,并在1991年在DECTA2的基础上把信息仓库的概念包含进去,并称之为VITAL规范,将PC、图形化界面、面向对象的组件以及局域网都包含在VITAL里,并定义了85种信息仓库的组件,包括数据抽取、转换、有效性验证、加载、Cube开发和图形化查询工具等。但是IBM只是将这种领先的概念用于市场宣传,而没有付诸实际的架构设计。这是IBM有一个领域上创新后停止不前导致丧失其领先地位。因此,在90年代初期,数据仓库的基本原理、框架架构,以及分析系统的主要原则都已经确定,主要的技术,包括关系型数据存取、网络、C/S架构和图形化界面均已具备,只欠东风了。
同时,在1988年-1991年,一些前沿的公司已经开始建立数据仓库。
4、确立阶段(1991)
企业级数据仓库(EDW,1991)1991年,BillInmon出版了其有关数据仓库的第一本书,这本书不仅仅说明为什么要建数据仓库、数据仓库能给你带来什么,更重要的是,Inmon第一次提供了如何建设数据仓库的指导性意见,该书定义了数据仓库非常具体的原则,包括:数据仓库是面向主题的(Subject-Oriented)、集成的(Integrated)、包含历史的(Time-variant)、相对稳定的(Nonvolatile)、面向决策支持的(DecisionSupport)面向全企业的(EnterpriseScope)最明细的数据存(AtomicDetail)数据快照式的数据获取(SnapShotCapture)这些原则到现在仍然是指导数据仓库建设的最基本原则,虽然中间的一些原则引发一些争论,并导致一些分歧和数据仓库变体的产生。
BillInmon凭借其这本书奠定了其在数据仓库建设的位置,被称之为“数据仓库之父”。
5、数据集市(1994-1996)
数据仓库发展的第一明显分歧是数据集市概念的产生。由于企业级数据仓库的设计、实施很困难,使得最早吃数据仓库螃蟹的公司遭到大面积的失败,因此数据仓库的建设者和分析师开始考虑只建设企业级数据仓库的一部分,然后再逐步添加,但是这有背于BillInmon的原则:各个实施部分的数据抽取、清洗、转换和加载是独立,导致了数据的混乱与不一致性。而且部分实施的项目也有很多失败,除了常见的业务需求定义不清、项目执行不力之外,很重要的原因是因为其数据模型设计,在企业级数据仓库中,Inmon推荐采用3范式进行数据建模,但是不排除其他的方法,但是Inmon的追随者固守OLTP系统的3范式设计,从而无法支持DSS系统的性能和数据易访问性的要求。
这时,Ralph Kimball出现了,他的第一本书“TheDataWarehouseToolkit”掀起了数据集市的狂潮,这本书提供了如何为分析进行数据模型优化详细指导意见,从DimensionalModeling大行其道,也为传统的关系型数据模型和多维OLAP之间建立了很好的桥梁。从此,数据集市在很多地方冒了出来,并获得很大成功,而企业级数据仓库已逐渐被人所淡忘。
6、争吵与混乱(1996-1997)
企业级数据仓库还是部门级数据集市?关系型还是多维?BillInmon和RalphKimball一开始就争论不休,其各自的追随者也唇舌相向,形成相对立的两派:Inmon派和Kimball派(有点象少林和武当,呵呵)。
在初期,数据集市的快速实施和较高的成功率让Kimball派占了上风,但是很快,他们也发现自己陷入了某种困境:企业中存在6-7个不同的数据集市,分别有不同的ETL,相互之间的数据也不完全一致。同时,各个项目实施中也任意侵犯了Inmon开始定下的准则:把数据集市当成众多OLTP系统之后的有一个系统,而不是一个基础性的集成性的东西,为保证数据的准确性和实时性,有的甚至可以由OLTP系统直接修改数据集市里面的数据,为了保证系统的性能,有的数据集市删除了历史数据。等等,不一而足。
当然,这导致了一些新的应用的出现,例如ODS,但是人们对DataWarehouse、DataMart、ODS的概念非常的模糊,经常混为一谈。有人说OLAP就是数据仓库,也有人说我要ODS和DataMart,不要Datawarehouse,也有人说,我DataMart建多了,自然就有DataWarehouse了。但是BillInmon一直很旗帜鲜明:“你可以打到几万吨的小鱼小虾,但是这些小鱼小虾加起来不是大鲸鱼”。
7、合并(1998-2001)
经过多翻争吵,证明one-size-fits-all是不可能的,你需要不同的BI架构来满足不同的业务需求。BillInmon也推出了新的BI架构CIF(Corporationinformationfactory),把Kimball的数据集市也包容进来了,第一次,Kimball承认了Inmon,但是仍然还有很多人在争论是自顶向下,还是自底向上。
8、未来
未来几个方向:时效性方向的实时数仓;数据质量方向的数据治理;数据中台、数据湖(欢迎留言讨论!)
推荐阅读:
二、四种常见数据模型
大数据时代,维度建模已成为各大厂的主流方式。
维度建模从分析决策的需求出发构建模型,为分析需求服务。重点关注用户如何快速的完成数据分析,可以直观的反应业务模型中的业务问题,需要大量的数据预处理、数据冗余,有较好的大规模复杂查询的响应性能。
1、为什么要进行数据仓库建模
- 性能:良好的模型能帮我们快速查询需要的数据,减少数据的IO吞吐
- 成本:减少数据冗余、计算结果复用、从而降低存储和计算成本
- 效率:改善用户使用数据的体验,提高使用数据的效率
- 改善统计口径的不一致性,减少数据计算错误的可能性
2、四种常见模型
2.1 维度模型
维度建模按数据组织类型划分可分为星型模型、雪花模型、星座模型。Kimball老爷爷维度建模四部曲:
选择业务处理过程 > 定义粒度 > 选择维度 > 确定事实
2.1.1 星型模型
星型模型主要是维表和事实表,以事实表为中心,所有维度直接关联在事实表上,呈星型分布。
2.1.2 雪花模型
雪花模型,在星型模型的基础上,维度表上又关联了其他维度表。这种模型维护成本高,性能方面也较差,所以一般不建议使用。尤其是基于hadoop体系构建数仓,减少join就是减少shuffle,性能差距会很大。
星型模型可以理解为,一个事实表关联多个维度表,雪花模型可以理解为一个事实表关联多个维度表,维度表再关联维度表。
2.1.3 星座模型
星座模型,是对星型模型的扩展延伸,多张事实表共享维度表。
星座模型是很多数据仓库的常态,因为很多数据仓库都是多个事实表的。所以星座模型只反映是否有多个事实表,他们之间是否共享一些维度表。
2.2 范式模型
即实体关系(ER)模型,数据仓库之父Immon提出的,从全企业的高度设计一个3NF模型,用实体加关系描述的数据模型描述企业业务架构,在范式理论上符合3NF。此建模方法,对建模人员的能力要求非常高。
特点:设计思路自上而下,适合上游基础数据存储,同一份数据只存储一份,没有数据冗余,方便解耦,易维护,缺点是开发周期一般比较长,维护成本高。
详见后文:三范式与反范式
2.3 Data Vault模型
DataVault由Hub(关键核心业务实体)、Link(关系)、Satellite(实体属性) 三部分组成 ,是Dan Linstedt发起创建的一种模型方法论,它是在ER关系模型上的衍生,同时设计的出发点也是为了实现数据的整合,并非为数据决策分析直接使用。
2.4 Anchor模型
高度可扩展的模型,所有的扩展只是添加而不是修改,因此它将模型规范到6NF,基本变成了K-V结构模型。企业很少使用。
信息技术智库关注领取技术资料、面试真题、简历模板和PPT模板;一起交流工作难题、面试套路、职场经验、内推直通车公众号
3、数据模型的评价标准
数据模型建设的怎么样,极度依赖规范设计,如果代码风格是“千人千面”,那么恐怕半年下来,业务系统就没法看了。没有什么比“数据系统”更看重“法制”了,规范体系不仅能保障数据建设的一致性,也能够应对业务交接的情况,更能够为自动化奠定基础。
- 业务过程清晰:ODS就是原始信息,不修改;DWD面向基础业务过程;DIM描述维度信息;DWS针对最小场景做指标计算;ADS也要分层,面向跨域的建设,和面向应用的建设;
- 指标可理解:按照一定业务事务过程进行业务划分,明细层粒度明确、历史数据可获取,汇总层维度和指标同名同义,能客观反映业务不同角度下的量化程度;
- 核心模型相对稳定:如果业务过程运行的比较久,过程相对固定,就要尽快下沉到公共层,形成可复用的核心模型;
- 高内聚低耦合:各主题内数据模型要业务高内聚,避免在一个模型耦合其他业务的指标,造成该模型主题不清晰和性价比低。
小编有话
- 在传统企业数仓中,业务相对稳定,以范式建模为主。如电信、金融行业等
- 在互联网公司,业务变化快,需求来来回回的改,计算和存储也不是问题,我们更关心快速便捷的满足业务需求,所以以维度建模为主。
三、三种事实表
事实表作为数据仓库维度建模的核心,紧紧围绕着业务过程来设 计,通过获取描述业务过程的度量来表达业务过程,包含了引用的维度 和与业务过程有关的度量。
1、三种事实表概述
事实表有三种类型 : 事务事实表、周期快照事实表和累积快照事实表。
- 1.1 事务事实表
也称原子事实表,描述业务过程,跟踪控件或时间上某点的度量事件,保存的是最原子的数据;
个人理解:类似于mysql binlog日志,每一次相关的 change 都记录下来,生成一行新的数据
- 1.2 周期快照事实表
以一个周期为时间间隔,来记录事实,一般周期可以是每天、每周、每月、每年等;
个人理解:只看某个业务过程,比如订单收货,数据按订单收货时间来切分,周期可以为每天、每月等。
- 1.3 累积快照事实
用来描述过程开始和结束之间的关键步骤事件,覆盖过程的整个生命周期,通常具有多个日期字段来记录关键时间点;当过程随着生命周期不断变化时,记录也会随着过程的变化而被修改;
个人理解:要看整个生命周期的多个业务过程,比如:创建订单 → 买家付款 → 卖家发货 → 买家确认收货。粒度是一个订单一行数据,创建订单时间,付款时间,发货时间,收货时间,分别作为一个字段,便于计算不同业务过程的时间间隔。
2、三种事实表对比
事务事实表 | 周期快照事实表 | 累积快照事实表 | |
时期/时间 | 离散事务时间点 | 以有规律的、可预测的 | 用于时间跨度不确定的不断变化的工作流 |
日期维度 | 事务日期 | 快照日期 | 相关业务过程涉及的多个日期 |
粒度 | 每行代表实体的一个事务 | 每行代表某时间周期的一个实体 | 每行代表一个实体的生命周期 |
事实 | 事务事实 | 累积事实 | 相关业务过程事实和时间间隔事实 |
事实表加载 | 插入 | 插入 | 插入与更新 |
事实表更新 | 不更新 | 不更新 | 业务过程变更时更新 |
3、事实表设计 8 大原则
- 原则 1:尽可能包含所有与业务过程相关的事实
- 分析哪些事实与业务过程相关,是设计过程中非常重要的关注点;
- 在事实表中,尽量包含所有与业务过程相关的事实,即使存在冗余,由于事实通常是数字型,存储开销不会太大;
- 原则 2:只选择与业务过程相关的事实
- 如,订单的下单这个业务过程,事实表中不应该存在支付金额这个表示支付业务过程的事实;
- 原则 3:分解不可加性事实为可加的组件
- 如,订单的优惠率,应分解为订单原价金额与订单优惠金额两个事实存储在事实表中;
- 原则 4:在选择维度和事实之前必须先声明粒度
- 因为原子粒度提供了最大限度的灵活性,可以支持无法预期的各种细节层次的用户需求;
- 粒度用于确定事实表中一行所表示业务的细节层次,决定了维度模型的扩展性;
- 每个维度和事实必须与所定义的粒度保持一致;
- 设计事实表时,粒度定义越细越好,一般从最低级别的原子粒度开始;
- 原则 5:在同一个事实表中不能有多种不同粒度的事实
- 粒度为票一级;(实际业务中,一个订单可以同时支付多张票)
- 票支付金额和票折扣金额,两个事实的粒度为 “票级”,与定义的粒度一致;
- 订单支付金额和订单票数,两个事实的粒度为 “订单级”,属于上一层订单级数据,与 “票级” 事实表的粒度不一致,且不能进行汇总;
- 如果,以订单金额和订单票数这两个维度汇总总金额和总票数,会造成大量的重复计算;
- 疑问:怎么判断不同事实的粒度是否相同?
- 原则 6:事实的单位要保持一致
- 如,订单金额、订单优惠金额、订单运费这 3 个事实,应该采用统一的计量单位,统一为元或者分,以方便使用;
- 原则 7:对事实的 null 值要处理
- 原因:在数据库中,null 值对常用数字型字段的 SQL 过滤条件都不生效;如,大于、小于、等于、大于或等于、小于或等于;
- 处理:用 0 代替 null ;
- 原则 8:使用退化维度提高事实表的易用性
- 易用性:对事实表,更较少关联操作、过滤查询、控制聚合层次、排序数据、定义主从关系等;
-
- 事实表中存储各种类型的常用维度信息,较少下游用户使用时关联多个表的操作;
- 通过退化维度,可以实现对事实表的过滤查询、控制聚合层次、排序数据、定义主从关系等;
- 在 Kimball 的维度建模中,通常按照星形模型的方式设计,通过事实表的外键关联专门的维表,这种方式来获取维度,谨慎使用退化维表;这与大数据领域的事实表设计不一样;
- 思路:通过增加冗余存储,减少计算开销,提高使用效率;
4、事实表设计方法
Kimball 的维度模型设计 4 步法:选择业务过程、声明粒度、确定维度、确定事实;
当前的互联网大数据环境,维度模型的设计,是基于 Kimball 的四步维度建模方法进行了更进一步的改进:
- 第一步:选择业务过程及确定事实表类型
- 如淘宝的一个交易订单,选择 “买家付款” 这个业务过程,则事实表类型应为只包含买家付款这一个业务过程的 “单事务事实表”;
- 如选择了所有 4 个业务过程,并且需要分享各业务过程的时间间隔,则事实表类型应为包含了所有 4 个业务过程的 “累积快照事实表”;
- 如是选择 “买家付款” 这个业务过程,还是选择 “创建订单” 和 “买家付款” 这两个业务过程,具体根据业务情况来定;
- 思路:详细分析需求,对业务的整个生命周期进行分析,明确关键的业务步骤,从而选择与需求有关的业务过程;
- 以实例说明:如何选择业务过程?如何确定事实表类型?
-
- 分析业务的生命周期,业务过程通常使用行为动词表示业务执行的活动;
- 明确关键的业务步骤:该订单流转的业务过程有 4 个:创建订单 → 买家付款 → 卖家发货 → 买家确认收货;
- 根据业务需求,选择与维度建模有关的业务过程;
- 根据所选的业务过程确定事实表类型;
- 第二步:声明粒度
- 粒度的作用:
- 粒度的选择:尽量选择最细级别的原子粒度,以确保事实表的应用具有最大的灵活性;
-
- 灵活性:支持无法预期的各种细节层次的用户需求;
- 对于订单级别,粒度可以定义为最细的订单级别;(如,父子订单,事实表的粒度可以定 “子订单级别” ;)
- 粒度的声明,意味着精确定义事实表的每一行所表示的业务含义;
- 明确的粒度能够确保对实表中行的意思的理解不会产生混淆,保证所有的事实按照同样的细节层次记录;
- 第三步:确定维度
- 如,淘宝订单 “付款事务事实表” 中,粒度为 “子订单”,相关的维度有买家、卖家、商品、收货人信息、业务类型、订单时间等;
以上是关于❤️ 爆肝三万字《数据仓库体系》轻松拿下字节offer ❤️建议收藏的主要内容,如果未能解决你的问题,请参考以下文章
❤️三万字《C/C++面试突击200题》四年面试官爆肝整合❤️(附答案,建议收藏)
❤️三万字《C/C++面试突击200题》四年面试官爆肝整合❤️(附答案,建议收藏)