数仓理论与实战

提示:本文旨在介绍数仓分层、数仓搭建


前言

有技术、懂产品、会分析、能建模、又能玩算法,最好全栈数据科学家,这样的人才更有可能让数据更有价值。


一、概念

1.为什么建?什么时候建

数据分门别类存储,更精细化管理,小成本发挥大价值。

当你需要集中化管理你的数据时

当你希望以更高效的方式使用数据时

当你的数据量和复杂度到了需要一个团队来维护时

当你希望想要数据驱动业务时

当你想要借助大数据的力量来提升产品竞争力时

当你想要时刻知道业务发展情况时

2.数据仓库vs数据中台

数据中台是基于数据仓库做成产品或服务,数据仓库是服务于数据中台的核心模块

二、数仓分层

1.ODS

ods层的数据种类十分丰富,包含几十种业务场景及日志数据。这里会包含很多损坏的数据和脏数据等。我们需要查看为什么会产生脏数据。ODS的意义,在于保存最完整的数据现场,便于一些特殊场景下的问题排查使用。

2.DWD

这里我们对数据会进行预处理,预处理就是将数据变成半结构化或结构化数据。例如在HDFS上存储标准格式,我们会用字符串的形式对数据统一储存,还有时候有场景需要我们会对数据直接转成Parquent等列存格式。有些时候还要发挥一些特定作用,因为业务的意外导致各种各样的错误数据进来,也是时有发生的。如客户消费了,金额总得是正的吧,但如果业务那边产生了一些错误,需要将金额设置成负值,虽然业务那边好处理了,但数据这里就头疼了。所以还需要经常打一些补丁,来处理金额负值这种异常情况。还有各式各样的反作弊要求,也是需要在DWD进行处理的。
简单来说,预处理就是对数据格式的转换、脏数据的过滤及数据更正。
这里数据处理主要采用MR进行,所以不会遇到数据倾斜的问题。

3.DWS

中间层,这里主要是数据建模。数据模型有很多,如:范式模型、维度模型等,但最常用的还是星型模型。我们会根据主题进行表数据设计,针对所有可能的维度,包括用户、行业、主体公司、广告投放计划、投放类型、投放地域做统计,每个类型都尽可能的冗余多的维度信息,这样对于提高下游计算的速度、减少运算数据量、简化业务逻辑、合并计算单元等具有特别大的好处。计算速度慢、数据倾斜等问题也都基本上集中在这个DWS层上。这里是数仓建设最关键的地方。

4.ADS

当需求足够多时,我们需要提供的报表就成百上千张,这里基本面临两个问题:
1、怎么保证数据的一致性呢?
2、怎么保证需求响应的速度呢?
需要尽量从单一中间层表中进行数据统计,中间层的数据一致性,就代表了最终业务数据的一致性。
响应速度同理,在某些不得不关联的业务场景下,因为中间层的存在,使得数据量减少了很多,需求响应速度也就提升了很多。

5.DIM

维度信息,这里涉及到了元数据等概念(再做解释)

数据仓库的难度在于,你不可能开始就设计好的,因为业务模块多种多样,还涉及到扩张带来的复杂性问题,是没谁能够预料到的。

二、数仓搭建步骤

整体流程划分:

需求分析——数仓分析——设计ODS系统——数仓建模——数据集市建模——数据源分析——数据获取与整合——应用分析——报表展现

1.需求分析

数仓最终是服务于业务的,前期要重视需求的调研、挖掘和分析。
调研经验:
1、最好需求人员和设计人员基于原型来讨论,从而正确的理解业务需求。
2、在需求讨论的基础上,需要理解业务工作流程,实事求是地将数据仓库所能实现的目标和不容易解决的问题与协商清楚。
3、需求方分类:数据查询者、报表查询者、企业决策者。这三类人群需求特点完全不同。
在这里插入图片描述
4.在许多情况下需求是不确定的,今天是A明天是B,无法做到一步到位,这都正常。作为项目实施者要做好心理预期。
一般情况下,业务方能够提供的都是需求的整体框架部分或者是实际需求的一部分内容,不能预见未来需要增加的需求,这也注定了数仓项目是一个不断循环、反馈,使系统不断完善增长的过程。
当需求调研完成时,需要对采集结果进行分析、归纳、整理,最终形成完整的需求分析报告。

以下是调研模板:(摘于《数据化建设知识图谱》)

在这里插入图片描述

2.逻辑分析

逻辑上分为:分成操作型数据库、数据仓库层、数据集市层、数据分析应用层和报表展示层

架构如下:

在这里插入图片描述

3.设计ODS系统

ODS有两种形式:一种是ods数据缓存区,另一种是ods统一信息试图区。
①ods数据缓存区
这里是业务数据流动的第一个储存区,将各个业务系统的数据源把数据抽取出来装载到ods缓存区,为以后的数据抽取、清洗、转换过程打下坚实的基础。对于数据源可以采用增量的方式抽取,对于经常变化更新的数据采用全量抽取。
②ODS统一信息试图区
这里是我们会有选择的集成各类业务源数据,对数据进行抽取、清晰、转换操作。Extract-Transform-Load(ETL抽取转换加载),对数据进行分类组织,使用户通过这一区域获得跟某个主题域相关的实时性数据。各业务系统和这一区域可以相互访问,可以生成具有实时性的操作性报表和查询某一主题额全部信息。
③区别
数据抽取、清洗、转换、加载的转换规则和数据存储的方式不同。统一信息试图区是完全按照主题的方式进行数据存储的,向用户快速提供报表展示和实时查询的功能;数据缓冲区的ETL规则一般只进行简单的汇总、计算,或者从操作型数据库中直接抽取而中间不进行任何转化。ODS 统一信息视图区的数据一般都是从ODS数据缓冲区中抽取过来的。

4.数仓维度建模

1、选择业务过程:根据业务过程确定相关分析主题。
2、明确粒度:业务处理所涉及事实的粒度。
3、标识维度:基于粒度确定维度,分析维表属性。
4、标识事实:根据分析的事实形成事实表。
星型模式:典型的事实表包含键和度量。星型模式用于简单的数据集市和非常大的数据仓库。星的中心由一个大的事实表组成,星的点是维度表。
**雪花模式:**雪花模式是比星型模式更复杂的数据仓库模型,是星型模式的一种。维度数据已分组到多个表中,而不是一个大表中。虽然这样可以节省空间,但会增加维度表的数量,并需要更多的外键联接。结果是查询更加复杂,查询性能降低。
优化星形查询

调整星形查询
使用星变换

调整星形查询、星变换

要获得星形查询的最佳性能,必须遵循一些基本准则:

1、 位图索引应该建立在事实数据表的每个外键列上。
2、 初始化参数:orcal数据库:STAR_TRANSFORMATION_ENABLED=TRUE。

第一个阶段从事实表(结果集)中准确地检索所需的行。因为这种检索利用位图索引,所以非常有效。第二个阶段将此结果集连接到维度表。

5.数据集市建模

数据集市建模主要针对事实表和维表的涉及。例如:部门员工关系表,如果事实表中包含部门编码,则可以分析到部门。如果也包含员工编码,则既可以分析到部门,又可以分析到员工。
一张事实表除了包含所要分析的维度编码外,还包括需要分析的度量值。例如,用户用电分析事实表,它的主题描述就是按地区、时间、电压等级统计用户的耗电量、应收电费,并进行同期对比;它的维度就是地区、时间、电压等级,度量值包括耗电量、应收电费等;指标来源就是数据仓库中的计费结果表、用户基本信息表。
维表一般采用增量的方式进行抽取。

在这里插入图片描述

6.数据源分析

对源数据进行分析和总结,得出源数据的范围、格式、更新频率和质量好坏的过程。
数据源分析是指通过需求调研得知业务数据源的基本情况,并且加以详细说明。
具体内容包括数据源中存在哪些物理表,表之间的关系和表中每个字段的数据类型和含义等。
一般来说,业务数据源通常会有数据不完整、口径不一致,或者各个数据源存在业务规则不统一的情况。
另外,在分析的过程中,需要确定业务源数据中哪些数据需要被抽取。为了确定合适的抽取方式,需要在抽取之前对数据源进行分析,分析的范围一般包括数据的格式、数据的范围、更新的方式、数据质量的好坏。在分析的过程中,应该尽可能获取分析的结果,形成数据源分析报告,在仔细研究分析报告后,再选择合适的抽取、加载方式。了解这些数据源的特点,有利于ETL 抽取时对数据的整合和统一,从而保证数据的质量和可信度。

7.数据的获取与整合

数据的获取与整合存在于数据仓库项目中的各个阶段。数据仓库很重要的一个作用就是将散落在各业务系统的数据整合起来,不规范的数据规范起来,以一种便于分析和应用的方式放到数据仓库里,供前端应用分析。ETL 过程实际上就是数据流动的过程,即从不同的数据源流向统一的目标数据库。

8.数据应用和报表展示

不管基于哪一层,都有做报表的需求。

三、相关

1.ETL:抽取、转换、加载

ETL工作的实质就是从各个数据源提取数据,对数据进行转换,并最终加载填充数据到数据仓库维度建模后的表中。只有当这些维度/事实表被填充好,ETL工作才算完成。
抽取(Extract)
该阶段主要是根据数据仓库主题、主题域确定需要从应用数据库中提取的数据。
转换(Transform)
转换步骤主要是指对提取好了的数据的结构进行转换,以满足目标数据仓库模型的过程。此外,转换过程也负责数据质量工作,这部分也被称为数据清洗(data cleaning)。
加载(Load)
加载过程将已经提取好了,转换后保证了数据质量的数据加载到目标数据仓库。加载可分为两种L:首次加载(first load)和刷新加载(refresh load)。其中,首次加载会涉及到大量数据,而刷新加载则属于一种微批量式的加载。

代码如下(示例):

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
warnings.filterwarnings('ignore')
import  ssl
ssl._create_default_https_context = ssl._create_unverified_context

2.读入数据

代码如下(示例):

data = pd.read_csv(
    'https://labfile.oss.aliyuncs.com/courses/1283/adult.data.csv')
print(data.head())

该处使用的url网络请求的数据。


总结

提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值