大家好,我是摇光~
对于刚进入大数据领域的萌新,且想要在数据分析岗、数据运维岗、数据工程师这些岗位立足,了解数据仓库是必要的,接下来我尽量用通俗易懂的语言让大家了解到数据仓库。
在当今大数据盛行的时代,数据仓库(Data Warehouse, 简称DW)作为企业决策支持的核心系统,扮演着举足轻重的角色。本文将深入探讨数据仓库的构建过程,介绍常用的构建工具,并通过多个实际案例来展示如何构建数据仓库。
一、数据仓库是什么?
我们都知道,现在是大数据盛行的时代,那么企业产生了这么多数据,我们该怎么利用这些数据,帮助企业做对应的决策。而数据仓库(Data Warehouse, 简称DW)就是作为企业决策支持的核心系统。
例如: 银行利用客户的存款数据和贷款数据,来分析哪些客户是重要客户,哪些业务是盈利业务,哪些银行产品可以带来最大收益。
而这些问题,可以通过数据仓库这个系统,进行数据规整后得到解决。
下面我们来具体看下比较官方的解释:
数据仓库 :是一个
面向主题的
、集成的
、随时间变化的
、但信息相对稳定
的数据集合,它主要用于支持企业或组织的决策分析过程。
(不用着急,我给你拆分了解释)
面向主题
:其实就是数据仓库把数据分成各种类别,比如银行数据,可以分成客户信息、对私贷款信息、对公贷款信息、对私存款信息、对公存款信息。集成的
:集成是指各大系统(比如客户信息系统、日志数据、交易系统等)的数据都放在(集成到)数据仓库,这是数据仓库的核心特点。随时间变化的
:时间变化是指,数据在根据业务不断的更新,比如昨天在银行有10个人开户了,今天这10个人就会出现在数据仓库系统里面。这样就记录了数据随时间的历史变化。信息相对稳定
:是指数据一旦进入数据仓库,数据是不可改变的,主要以只读方式进行数据访问;比如你在银行存款,今天存500,余额剩1000,这在你的 app 是变化的,但是在数据仓库里面500是一条历史数据,1000是今天的数据。(主打一个记录数据变化,不允许你变动历史数据)
与传统数据库相比,数据仓库更注重数据的分析性、历史性和集成性,旨在为企业提供一个全面、一致的数据视图,以支持各种复杂的分析需求。
二、数据仓库与传统数据库的区别
我们了解到了数据仓库是什么,也知道了他的哪些好处,我们再来看看与传统数据库的差别。
用途:
- 传统数据库:主要用于联机事务处理(OLTP),即实时的系统交互,如银行交易、电商平台订单处理等。
- 数据仓库:主要用于联机分析处理(OLAP),即数据的分析和报表生成。它支持对历史数据的回溯和分析,为企业的战略决策提供支持。
(不太了解 OLTP和OLAP的,可以看一下这篇文章:【OLAP和PLTP】)使用技术:
- 传统数据库:通常使用关系型数据库,如MySQL、Oracle、SQL Server等。
- 数据仓库:在互联网行业更多地采用大数据技术,如Hadoop等。
建模方式:
- 传统数据库:主要采用范式建模,确保数据的规范化和减少冗余。
- 数据仓库:具有更大的灵活性,可以根据需要选择范式建模或者采用星形模型等其他建模方式。(后面我会提到数据仓库的建模模型)
存储的数据:
- 传统数据库:支持实时的增删改查操作,确保数据的一致性和完整性。
- 数据仓库:主要提供数据的查询功能,不支持数据的增删改操作。
三、数据仓库的层级结构
数据仓库按层次来进行数据处理,每一层都有一定的意义,基本架构分为六层,可根据实际业务增减。
3.1 数据源层:
- 数据仓库的起点,包含各种数据源,如关系数据库、文件系统、外部API、传感器数据等。 数据可以是结构化、半结构化或非结构化的。
- 例如银行业务数据源:信贷数据库、主客户数据库、ATM数据库、核心存款数据库
- 功能:负责收集和整合来自不同来源的数据。
3.2 数据采集/提取层(有时也称为ETL层):
- 使用ETL(提取、转换、加载)工具将数据从数据源层提取到数据仓库中。
- 提取过程可以是定期的(如每日、每周)或实时的,具体取决于业务需求。
- 包括对数据的转换,以确保数据在进入仓库之前符合标准格式。
- 需要了解 ETL 的,可以看一下这篇文章 :5分钟浅谈 ETL(适合新手小白)
- 想了解 ETL工具的,可以查看这篇文章 :十款常用的ETL工具(适合收藏)
3.3 数据存储层:
- 数据仓库的核心部分,负责存储经过提取和转换的数据。
- 通常使用关系型数据库管理系统(RDBMS)或大数据存储解决方案(如Hadoop、Spark等)。
- 数据被组织成主题模型或星型模式、雪花模式,以便于查询和分析。
3.4 数据处理层:
- 负责对存储在数据仓库中的数据进行进一步处理,可能包括数据聚合、统计分析和数据挖掘等操作。
- 这样做法是为了支持复杂的分析和报表生成。
3.5 数据分析层:
- 负责对处理后的数据进行深度分析,以支持业务决策和战略规划。
- 采用OLAP、数据挖掘、机器学习等技术,对数据进行多维度的分析和建模。
- 设计时需要考虑数据的分析速度、分析能力以及分析结果的解释性。
3.6 数据展现/展示层:
- 数据仓库的最终层,负责将分析结果以可视化的形式展现给用户。
- 通常采用报表、仪表盘、数据可视化工具等方式。
- 设计时需要考虑数据的展现效果、展现速度以及用户的交互体验。
三、构建数据仓库的步骤
我们现在来看看数据仓库的构建过程:(下面我以构建银行数据仓库为例子来讲解)
我尽量把涉及到这个系统的相关人员都会讲清他的职责,可能会有些啰嗦了~
前言:你现在是银行的数据开发工程师,现在需要和团队伙伴建设银行数据仓库。
3.1 需求收集
其实需求分析是最难的,不过这对你技术人员就不太需要关注;现在是团队中的业务分析员对接各大业务部门(比如:资产负债管理部、总行办公室、公司业务部),对每个部门提出的数据分析难点、需求进行挨个统计。
例如:资产负债管理部需要知道银行有多少存贷款的金额、利率等信息。
这一步主要是业务分析员对各大部门的业务进行需求收集;最终得到一份需求报告,主要是关于:哪些部门想要得到哪些数据,想要获取到哪些指标。
3.2 逻辑分析
这一步主要就需要项目经理,项目经理根据第一步的需求分析结果,进行数据仓库的逻辑设计,包括:确定数据仓库需要哪些主题(在第一节我已经讲过主题是什么了)、哪些维度、哪些指标、并设计数据仓库的整体框架。
3.3 数据源分析
数据源分析,就可以根据第二步得到的需求分析结果,确定数据仓库需要从哪些系统中获取数据,以及这些数据的格式、结构和质量如何。
例如:我们要从客户信息系统取个人客户信息表、对公客户信息表、客户证件信息表、客户地址信息表。
- 并且根据上面获取的表数据,我们需要分析这些数据的格式是哪样的,质量好不好,比如有些日期数据用的字符串格式,比如有些个人客户表中的性别为空(这就是质量不好),比如有些数据在导出后乱码。反正各种问题都会存在。
- 这一步我们可以创建建表语句
3.4 数仓建模
这是数据仓库构建的核心环节,需要选择合适的建模方法(如星型模型、雪花模型等)来设计数据仓库的结构。
先了解两个表:
事实表
:是指业务活动的度量,比如银行的存款金额、贷款金额、利率、利息等度量信息维度表
:是指业务的各种维度信息,如客户信息表、存款产品表、贷款产品表、部门表等
接下来我介绍一下数仓的几种常见模型:
1、星型模型
- 结构:以一个或多个事实表为中心,这些表记录了业务活动的度量值,如销售额、订单数量等。围绕事实表的是多个维度表,这些表提供上下文信息,如时间、地点、产品等。
- 优点:结构简单明了,易于理解和查询;查询效率高,因为所有维度表都直接与事实表相连,查询时只需要一次连接操作;维护简单。
- 缺点:当数据量非常大时,可能会遇到性能瓶颈;由于缺乏规范化,数据冗余问题可能会比较严重。
- 适合场景: 适用于大多数商业智能应用,特别是那些需要快速响应查询的场景。例如,在零售行业中,星型模型可以帮助快速分析销售数据,以便企业及时调整销售策略。
2、雪花模型
- 结构:雪花模型是星型模型的扩展,其特点是维度表被进一步规范化。也就是说,维度表可能会被拆分成多个相关的子表,以消除数据冗余。
- 优点:数据存储更加紧凑,减少了冗余数据;提高了数据的一致性和完整性;在进行数据更新和维护时更加方便,因为每个维度表都是独立的,可以单独进行更新。
- 缺点:查询性能可能较低,特别是在进行复杂查询时,需要进行多次连接操作,增加了查询的复杂性和时间成本。
- 适合场景:适用于数据结构复杂、数据量大的场景,特别是那些对数据一致性要求较高、查询频率较低的场景。例如,在银行业中,客户信息和交易记录需要高度一致和规范化,雪花模型就显得尤为适用。
3、星座模型
- 结构:也称为事实星座,是一种复杂的数据仓库设计模式,允许多个相关的事实表共享维度表。
- 优点:灵活性高,能够支持复杂的业务分析需求;数据集成度高,因为多个事实表共享相同的维度表。
- 缺点:结构复杂,设计和维护成本较高;查询性能可能不如星型模型和雪花模型。
- 适合场景:适用于需要同时分析多个业务过程的场景,特别是那些需要多个度量标准的复杂业务需求。例如,在一个大型制造企业中,生产过程和销售过程需要同时进行分析,这时星座模型就能够提供有效的支持。
通过这一步,我们可以将数据仓库的事实表、维度表等表的表结构确定了,然后创建各个表的建表语句,并确定哪些表由哪些源表才能构建出来。
比如你想要整个银行的客户信息,所以你需要将对公客户信息表、对私客户信息表关联起来,才能获得全部客户信息。
3.5 ETL处理(抽取、转换、加载)
ETL也是数据仓库的核心,ETL分别代表 抽取、转换、加载。
ETL过程通常通过ETL工具或脚本实现,这些工具提供了图形化界面或编程语言接口,方便用户定义和执行ETL任务。
- 一些常见的ETL工具包括Apache NiFi、Talend、Pentaho Data Integration(PDI)、Informatica等。
我们来看看这三个具体是干什么事情?
Extract(抽取):
这一步骤的目的是从各种数据源(如关系型数据库、NoSQL数据库、日志文件、API等)中捕获和提取数据。
数据源可能分散在不同的位置,格式也可能各不相同。
因此,抽取过程需要解决数据的访问和读取问题,确保数据的完整性和准确性。
Transform(转换):在数据被提取后,经常需要进行一系列的转换操作,以满足数据仓库的存储和分析需求。
这些转换可能包括数据类型转换、数据清洗(去除重复数据、处理缺失值等)、数据拆分或合并、数据聚合等。就像我刚刚举的例子(有些个人客户表中的性别为空,个人客户和对公客户需要合并)
转换过程的目标是将原始数据转换为结构化和标准化的格式,以提高数据的质量和可用性。
Load(加载):
加载步骤是将转换后的数据加载到目标数据仓库中。
这通常涉及将数据写入到数据库表或其他存储结构中。
加载过程需要考虑数据的存储效率、索引的创建以及数据的分区策略等,以确保数据仓库的性能和可扩展性。
这一步其实简单来说,就是将各种源表加载到刚刚所说的模型中的表里面。
3.6 数据访问与应用开发
数据访问与应用开发是数据仓库的终极目标,是为了实现数据的利用和价值的最大化。
数据访问主要包括数据查询、数据分析和数据展示,通过数据访问工具和方法,用户可以方便地获取和使用数据仓库中的数据,现在基本都是进行可视化的展示。
想了解可视化的工具可以看一下这篇文章:23款数据可视化工具
以上就是构建数据仓库的整个步骤。
四、案例详解
案例:滴滴顺风车实时数仓构建
背景介绍:
滴滴顺风车业务需要实时地监控和分析订单数据,以支持业务决策和运营优化。为了满足这一需求,滴滴数据团队决定构建一个实时数仓。
数仓架构:
滴滴顺风车实时数仓的架构包括ODS层、DWD层、DIM层和DWM层等关键层次。其中:
- ODS层:作为贴源层,存储从各种数据源采集的原始数据,包括订单相关的binlog日志、冒泡和安全相关的public日志、流量相关的埋点日志等。
- DWD层:即明细数据层,对ODS层的数据进行清洗和转换,生成可用于后续分析的明细数据。
- DIM层:公共维度层,存储各种维度信息,如城市、渠道等,用于在后续分析中与明细数据进行关联。
- DWM层:汇总数据层,根据业务需求对明细数据进行汇总和计算,生成各种汇总指标。
数据获取与整合:
在数据获取与整合阶段,滴滴数据团队利用Kafka、Flink等工具实现了数据的实时采集和传输。同时,通过可以编写ETL脚本对原始数据进行清洗和转换,确保数据的一致性和可靠性。
应用分析与报表展现:
在数据应用分析和报表展现阶段,滴滴数据团队利用Tableau等工具实现了对实时数仓中数据的可视化分析。通过构建各种图表和仪表盘,将分析结果直观地呈现给决策者,支持业务决策和运营优化。