学习
实践
活动
专区
工具
TVP
写文章
专栏首页木东居士的专栏一种通用的数据仓库分层方法

一种通用的数据仓库分层方法

0x00 概述

数据分层是数据仓库设计中十分重要的一个环节,优秀的分层设计能够让整个数据体系更易理解和使用。而目前网络中大部分可以被检索到相关文章只是简单地提及数据分层的设计,或缺少明确而详细的说明,或缺少可落地实施的方案,或缺少具体的示例说明。

因此,本文将指出一种通用的数据仓库分层方法,具体包含如下内容:

  1. 介绍数据分层的作用
  2. 提出一种通用的数据分层设计,以及分层设计的原则
  3. 举出具体的例子说明
  4. 提出可落地的实践意见

0x01 数据分层?

“为什么要设计数据分层?”

这应该是数据仓库同学在设计数据分层时首先要被挑战的问题,类似的问题可能会有很多,比如说“为什么要做数据仓库?”、“为什么要做元数据管理?”、“为什么要做数据质量管理?”。当然,这里我们只聊一下为什么要做设计数据分层。

作为一名数据的规划者,我们肯定希望自己的数据能够有秩序地流转,数据的整个生命周期能够清晰明确被设计者和使用者感知到。直观来讲就是如下的左图这般层次清晰、依赖关系直观。

但是,大多数情况下,我们完成的数据体系却是依赖复杂、层级混乱的。如下的右图,在不知不觉的情况下,我们可能会做出一套表依赖结构混乱,甚至出现循环依赖的数据体系。

因此,我们需要一套行之有效的数据组织和管理方法来让我们的数据体系更有序,这就是谈到的数据分层。数据分层并不能解决所有的数据问题,但是,数据分层却可以给我们带来如下的好处:

  1. 清晰数据结构:每一个数据分层都有它的作用域和职责,在使用表的时候能更方便地定位和理解
  2. 减少重复开发:规范数据分层,开发一些通用的中间层数据,能够减少极大的重复计算
  3. 统一数据口径:通过数据分层,提供统一的数据出口,统一对外输出的数据口径
  4. 复杂问题简单化:将一个复杂的任务分解成多个步骤来完成,每一层解决特定的问题

0x02 一种通用的数据分层设计

为了满足前面提到数据分层带来的好处,我们将数据模型分为三层:数据运营层( ODS )、数据仓库层(DW)和数据应用层(APP)。如下图所示。简单来讲,我们可以理解为:**ODS层存放的是接入的原始数据,DW层是存放我们要重点设计的数据仓库中间层数据,APP是面向业务定制的应用数据。**下面详细介绍这三层的设计。

一、数据运营层:ODS(Operational Data Store)

“面向主题的”,数据运营层,也叫ODS层,是最接近数据源中数据的一层,数据源中的数据,经过抽取、洗净、传输,也就说传说中的 ETL 之后,装入本层。本层的数据,总体上大多是按照源头业务系统的分类方式而分类的。

一般来讲,为了考虑后续可能需要追溯数据问题,因此对于这一层就不建议做过多的数据清洗工作,原封不动地接入原始数据即可,至于数据的去噪、去重、异常值处理等过程可以放在后面的DWD层来做。

二、数据仓库层:DW(Data Warehouse)

数据仓库层是我们在做数据仓库时要核心设计的一层,在这里,从 ODS 层中获得的数据按照主题建立各种数据模型。DW层又细分为 DWD(Data Warehouse Detail)层、DWM(Data WareHouse Middle)层和DWS(Data WareHouse Servce)层。

1. 数据明细层:DWD(Data Warehouse Detail)

该层一般保持和ODS层一样的数据粒度,并且提供一定的数据质量保证。同时,为了提高数据明细层的易用性,该层会采用一些维度退化手法,将维度退化至事实表中,减少事实表和维表的关联。

另外,在该层也会做一部分的数据聚合,将相同主题的数据汇集到一张表中,提高数据的可用性,后文会举例说明。

2. 数据中间层:DWM(Data WareHouse Middle)

该层会在DWD层的数据基础上,对数据做轻度的聚合操作,生成一系列的中间表,提升公共指标的复用性,减少重复加工。

直观来讲,就是对通用的核心维度进行聚合操作,算出相应的统计指标。

3. 数据服务层:DWS(Data WareHouse Servce)

又称数据集市或宽表。按照业务划分,如流量、订单、用户等,生成字段比较多的宽表,用于提供后续的业务查询,OLAP分析,数据分发等。

一般来讲,该层的数据表会相对比较少,一张表会涵盖比较多的业务内容,由于其字段较多,因此一般也会称该层的表为宽表。

在实际计算中,如果直接从DWD或者ODS计算出宽表的统计指标,会存在计算量太大并且维度太少的问题,因此一般的做法是,在DWM层先计算出多个小的中间表,然后再拼接成一张DWS的宽表。由于宽和窄的界限不易界定,也可以去掉DWM这一层,只留DWS层,将所有的数据在放在DWS亦可。

三、数据应用层:APP(Application)

在这里,主要是提供给数据产品和数据分析使用的数据,一般会存放在 ES、PostgreSql、Redis等系统中供线上系统使用,也可能会存在 Hive 或者 Druid 中供数据分析和数据挖掘使用。比如我们经常说的报表数据,一般就放在这里。

四、维表层(Dimension)

最后补充一个维表层,维表层主要包含两部分数据:

  1. 高基数维度数据:一般是用户资料表、商品资料表类似的资料表。数据量可能是千万级或者上亿级别。
  2. 低基数维度数据:一般是配置表,比如枚举值对应的中文含义,或者日期维表。数据量可能是个位数或者几千几万。

至此,我们讲完了数据分层设计中每一层的含义,这里做一个总结便于理解,如下图。

0x03 举个栗子

趁热打铁,举个栗子说明一下,如下图,可以认为是一个电商网站的数据体系设计。我们暂且只关注用户访问日志这一部分数据。

  1. 在ODS层中,由于各端的开发团队不同或者各种其它问题,用户的访问日志被分成了好几张表上报到了我们的ODS层。
  2. 为了方便大家的使用,我们在DWD层做了一张用户访问行为天表,在这里,我们将PC网页、H5、小程序和原生APP访问日志汇聚到一张表里面,统一字段名,提升数据质量,这样就有了一张可供大家方便使用的明细表了。
  3. 在DWM层,我们会从DWD层中选取业务关注的核心维度来做聚合操作,比如只保留人、商品、设备和页面区域维度。类似的,我们这样做了很多个DWM的中间表
  4. 然后在DWS层,我们将一个人在整个网站中的行为数据放到一张表中,这就是我们的宽表了,有了这张表,就可以快速满足大部分的通用型业务需求了。
  5. 最后,在APP应用层,根据需求从DWS层的一张或者多张表取出数据拼接成一张应用表即可。

备注:例子只是为了简单地说明每一层的作用,并不是最合理的解决方案,大家辩证地看待即可

0x04 技术实践

既然谈到了数据分层,那不同的层次中会用到什么计算引擎和存储系统呢,本节来简单分享一下。

数据层的存储一般如下:

  1. Data Source:数据源一般是业务库和埋点,当然也会有第三方购买数据等多种数据来源方式。业务库的存储一般是Mysql 和 PostgreSql。
  2. ODS 层:ODS 的数据量一般非常大,所以大多数公司会选择存在HDFS上,即Hive或者Hbase,Hive居多。
  3. DW 层:一般和 ODS 的存储一致,但是为了满足更多的需求,也会有存放在 PG 和 ES 中的情况。
  4. APP 层:应用层的数据,一般都要求比较快的响应速度,因此一般是放在 Mysql、PG、Redis中。

计算引擎的话,可以简单参考图中所列就行。目前大数据相关的技术更新迭代比较快,本节所列仅为简单参考。

0x05 思考

如同《漫谈数据仓库和范式》一文在最后思考数据仓库和范式之间的关系一样,本文也将思考和总结一下数据分层的原则是什么?为什么要这样分层?每层之间的界限又是什么?

我个人从这几个角度来理解数据分层的划分:

  1. 从对应用的支持来讲,我们希望越靠上层次,越对应用友好。比如APP层,基本是完全为应用来设计的,很易懂,DWS层的话,相对来讲就会有一点点理解成本,然后DWM和DWD层就比较难理解了,因为它的维度可能会比较多,而且一个需求可能要多张表经过很复杂的计算才能完成。
  2. 从能力范围来讲,我们希望80%需求由20%的表来支持。直接点讲,就是大部分(80%以上)的需求,都用DWS的表来支持就行,DWS支持不了的,就用DWM和DWD的表来支持,这些都支持不了的极少一部分数据需要从原始日志中捞取。结合第一点来讲的话就是:80%的需求,我们都希望以对应用很友好的方式来支持,而不是直接暴露给应用方原始日志。
  3. 从数据聚合程度来讲,我们希望,越上层数据的聚合程度越高,看上面的例子即可,ODS和DWD的数据基本是原始日志的粒度,不做任何聚合操作,DWM做了轻度的聚合操作只保留了通用的维度,DWS做了更高的聚合操作,可能只保留一到两个能表征当前描述主体的维度。从这个角度来看,我们又可以理解为我们是按照数据的聚合程度来划分数据层次的。

0xFF 总结

数据分层的设计,在某种程度上也需要通过数据命名来体现,本文的核心在于讲解数据分层的思想和方法,后面会有单独的文章来分享该如何根据数据分层来设计数据表的命名规范。

文章分享自微信公众号:
木东居士

本文参与 腾讯云自媒体分享计划 ,欢迎热爱写作的你一起参与!

作者:木东居士
原始发表时间:2018-12-26
如有侵权,请联系 cloudcommunity@tencent.com 删除。
登录 后参与评论
0 条评论

相关文章

  • 数据仓库的分层和作用特点_数据仓库的架构以及数据分层

    现在说数仓,更多的会和数据平台或者基础架构搭上,已经融合到整个基础设施的搭建上。这里呢,我们不说Hadoop各种组件之间的配合,我们就简单说下数仓分层的意义价值...

    全栈程序员站长
  • IOS控件动画的一种通用方法

    最近在做一个垂直弹幕控件 , 在做控件动画时费了不少心思, 这里分享一些心得. 前言 关于动画, 我们一般使用UIKit提供的动画来实现. UIVie...

    MelonTeam
  • 大数据-数据仓库的分层架构

    按照数据流入流出的过程,数据仓库架构可分为三层——源数据、数据仓库、数据应用。

    cwl_java
  • 漫谈数据仓库的分层架构与演进

    分层架构很容易在各种书籍和文档中去理解,但是把建模方法和分层架构放在一起就会出现很多困惑了。接下来,我会从数据研发与建模的角度,演进一下分层架构的设计原因与层次...

    数据社
  • 一种针对WEB前端混淆防护的通用对抗方法

    在介绍“WEB前端混淆防护”之前,我们先来了解一下“WEB前端混淆”。一般来说,WEB前端混淆技术可以在不影响页面呈现和用户交互的情况下,将HTTP会话报文中的...

    绿盟科技研究通讯
  • 一种基于分层聚合的3D实例分割方法(ICCV 2021)

    Hierarchical Aggregation for 3D Instance Segmentation (ICCV 2021)

    3D视觉工坊
  • 一种质量分层的模型以及总结思考

    1、功能质量 2009年,我们还在使用PC电脑上淘宝、上人人网。这一时期软件质量要保障的主要是软件功能的可用性。因此,我们把这一阶段的质量称为“功能质量”,质...

    用户5521279
  • 一种基于定性理论答案集的编码推理通用方法(CS)

    译文:定性推理涉及到根据定性术语(如自然语言表达式)表达和推导知识,而不是严格的数学量。到目前为止,已经提出了超过40种定性计算方法,主要是在空间和时间领域,有...

    N乳酸菌
  • 如何评估神经网络的"鲁棒性"?一种通用方法:CLEVER

    神经网络鲁棒性评估一直是深度学习领域中一个热门的研究方向,该论文是通用评估神经网络鲁棒性方法的开山之作。作者将神经网络鲁棒性问题转换成局部Lipschitz常数...

    CV君
  • 一种通用调度平台的设计思路

    工作流:有的同学认为执行一个脚本就是执行一个任务,而有的同学则是将多个脚本组装的流称为任务。本文采用后者的思路,为了避免歧义,则会将任务流称为工作流。

    YG
  • 分层次的电路设计方法

    timerring
  • MySQL的通用优化方法

    本文整理了一些MySQL的通用优化方法,做个简单的总结分享,旨在帮助那些没有专职MySQL DBA的企业做好基本的优化工作,至于具体的SQL优化,大部分通过加适...

    用户1263954
  • 从语言模型到声学模型的知识提炼:一种分层多任务学习方法

    自我监督学习的预训练语言模型(LM)的显著表现导致了自然语言处理研究的重大范式转变。基于这些变化,利用大规模基于深度学习的LMs来提高语音识别系统的性能是语音识...

    芽芽
  • 分层安全用于通用客户端设备(uCPE)部署的准则

    SDNLAB
  • 【SLAM】视觉SLAM基本功能的一种通用方法——体素图

    论文地址: https://arxiv.org/pdf/2003.02247.pdf

    CNNer
  • SIGIR2021 | 一种自动发掘CTR预估中强大特征交互的通用方法

    本文分享一篇发表在SIGIR’21的点击率预估方面的文章,AutoPI:一种自动发掘点击率预估中强大特征交互的通用方法[1]

    张小磊
  • 通用「接口缓存中间件」的一种实现

    打开 google sheets,编辑完数据准备导出,文件下的子菜单,从上到下扫了几遍愣是没找到导出按钮,不对呀,明明一直在这???

    fjywan
  • 使用分层的方法设计机器人软件

    机器人软件架构是典型的控制回路的层次集, 包含了高端计算平台上的高级任务规划、运动控制回路以及最终的现场可编程门阵列(FPGA)。 在这中间,还有循环控制路径规...

    机器人网
  • 一种高效且通用的数据分析思维

    很多旁友在刚接触数据分析的时候,缺乏数据思维的支持,做起分析来感觉找不准方向,很难通过分析挖掘出数据的价值。因此,我今天给刚入行的新人们分享一种通用的数据分析思...

    朱小五

扫码关注腾讯云开发者

领取腾讯云代金券