数仓建模—宽表的设计

2023-10-30

宽表的设计

高内聚低耦合

宽表是数仓里面非常重要的一块,数仓是分层的,这是技术进步和时代变化相结合的产物,数仓的分层式为了更好地管理数仓以及更加高效地进行数据开发。

宽表主要出现在dwd 层和报表层,当然有的人说dws 层也有,宽表,从字面意义上讲就是字段比较多的数据库表,通常情况下是将很多相关的数据包括维度表、实时、已有的指标或者是dws/dwd 表关联在一起形成的一张数据表。

由于把不同的内容都放在同一张表存储,宽表已经不符合范式设计的模型设计规范而且数仓里面也不强调范式设计,随之带来的就是数据的大量冗余,与之相对应的好处就是查询性能的提高与便捷。

为什么要建设宽表

分层的目的是为了管理方便、开发高效、问题定位、节约资源等等,那么建设宽表呢?前面学习建模方法论的时候,提到过维度模型的非强范式的,可以更好的利用大数据处理框架的处理能力,避免范式操作的过多关联操作,可以实现高度的并行化。数据仓库大多数时候是比较适合使用星型模型构建底层数据Hive表,通过大量的冗余来提升查询效率,星型模型对OLAP的分析引擎支持比较友好,这一点在Kylin中比较能体现。

可以更好的发挥大数据框架的能力

维度模型可以更好地利用大数据框架,体现在哪里的,体现在数据数据冗余,可以避免很多的关联,怎么体现的呢,宽表。但是这只是站在大数据框架层面上的理解,还有其他层面上的理解。

可以提高开发效率

一般情况下,宽表包含了很多相关的数据,如果在宽表的基础上做一些开发,那就很方便,直接从宽表里面取数据,避免了从头计算。

可以提高数据质量

宽表的准确性,一般都是经历了时间的检验的,逻辑错误的可能性很小,可以直接使用。

可以统一指标口径

其实这一点和上面一点有点重复,但是这两点的强调的方面是不一样的,因为如果报表要是都能从底层宽表出,那么报表上的指标肯定是一样的,同一个指标的口径不一致,导致提供的数据在不同的出口不一样,是业务部门经常提出的一个问题。其实这也就是一直强调的核心逻辑下沉的原因。

宽表的好处和不足

宽表的好处就是为什么要建设宽表的原因,当然宽表也有一些不足之处

性能不高

因为宽表的计算逻辑往往很复杂,再加上宽表的数据输入是有大量依赖的,也就是说需要处理的数据量很大,在负载逻辑+大数据量的原因下,导致宽表往往运行很慢,资源占用很多,尤其是重跑的时候。

稳定性不高

image-20210624143912481

下面的最后一张表就是一张宽表,一个系统的稳定性是取决于最差的一个环节的,这就是短板理论也叫木桶理论,宽表的稳定性也是很差的,这个主要是因为宽表依赖太多,每一个表的不稳定性都会传到到宽表。

假设 一张表依赖A B C 三张表,并且这三张表的稳定性是 1/m 1/n 1/x,那么宽表的稳定性就是 1/mnx ,至于表的稳定性你可用它成功运行的次数/运行的总次数

如果性能不高和稳定性不高同时作用在一件事上的时候知道这其实是很致命的,例如你发现报表数据有问题,但是重跑需要几个小时,哈哈!

开发难度大/维护成本高

基于宽表做报表开发才是正确的姿势,但是宽表本身也开发人员开发的,因为本身的逻辑很复杂设计的业务逻辑繁多,所以给开发就带来了挑战,而且由于业务逻辑的变更也需要去维护着复杂的逻辑,例如每次都让你在几千行的SQL 里面加逻辑。

如何设计宽表

如何从设计的角度来避免宽表的不足之处

宽表到底多宽

开始之前,思考一个问题,那就是宽表到底有多宽,就想分层的时候说其实不分层也玩得转,早起的数仓就只有一层,现在考虑一个问题那就是宽表到底多宽才合适,其实你要把所有的数据装进去也可以。

所以要思考到底多宽才合适的,前面介绍过数据域的概念,与其回答多宽这个问题,不如回答宽表都应该覆盖哪些数据,但是这个问题也不好回答,但是可以反着思考,宽表不应该包含什么数据,这个问题很好回答,宽表不应该包含不属于它所在域的数据,例如会员域的宽表只应该包含会员相关的信息,同理宽表是针对某一个域而言的,也就是说它是有边界的。

这下再来回答宽表到底多宽,只要不跨域,并且方便使用都是合理的。但是这似乎并不能解决上面提到的宽表的不足,只是指明了宽表的一个大致的方向。有了方向之后通过设计策略就可以让宽表瘦下来。

主次分类

主次分离,其实经常听到的一句话就是做事情要搞清楚主次,看一下表设计的主次是什么,假设做的是一个会员域的宽表,但是会员域是还是一个比较大的概念,所以还要发掘出这个表的主题,例如做的是一张会员域下的会员基本信息宽表,那么专注的肯定就是基本信息,例如会员信息打通。当让因为事宽表你可能还会冗余的其他信息进来,但是当这样的信息越来越多的时候,这张表的主题就越来越弱,所以就需要做拆分。

拆分可以让更加聚焦表的主题,对于数仓开发人员而言可以更好的维护、对于使用方而言可以更加清楚的理解这张表的主题。

冷热分离

除了前面的主次分离还可以做冷热分离,其实冷热分离这个词相信你不是第一次听到,但是怎么看这个事情呢,你想一下你在数据存储的时候是怎么做冷热分离的,这里也是同样的理念。

假设有一张宽表,里面有200个字段,有30张报表在使用它,但是发现前面150个经常字段经常被使用,后面 50个字段只有一两张报表使用到了,那么就可以做一个冷热分离,将宽表拆分。

稳定与不稳定分离

其实前面的主次分离、冷热分离都可以提高稳定性,但是前提不是为了稳定性分离的。

经常有这样的宽表,它依赖埋点数据,但埋点数据的特点就是量大,导致计算经常延迟,那么宽表就会受影响,从而报表就受影响,但是很多时候你发现报表根本没有用过埋点计算出来的指标,或者是只用了一两个。那可以将其拆分,如果报表没有使用到那就最好了,如果使用到了,那就后推,在报表层面上做关联,这样埋点数据即使出不来,报表数据还是可以看的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数仓建模—宽表的设计 的相关文章

随机推荐

  • 十大PyTorch最常用的转换函数

    介绍 Pytorch是一个深度学习框架 广泛用于图像分类 分割 目标识别等各种任务 在这种情况下 我们必须处理各种类型的数据 很可能在大多数情况下 数据可能不是我们所需要的格式 PyTorch转换就是救星 torchvision trans
  • 恩施职业技术学院工程能力实训开班!青春逐梦,砥砺前行

    为深化校企合作 产教融合助力新工科建设 提升学生工程实践能力 电巢工程能力实训班按照不同岗位类别 匹配对应的企业岗位任职能力要求对学生开展分级培养 以产业需求为导向 培养创新型 应用型人才 6月13日上午 深圳电巢联合恩施职业技术学院 工程
  • SessionID漏洞

    漏洞原理 当用户第一次访问服务程序时 服务器端会给用户创建一个独立的会话Session 并且生成一个SessionID SessionID在响应浏览器的时候会被加载到cookie中 并保存到浏览器中 当用户再一次访问服务程序时 请求中会携带
  • golang命令行库cobra的使用

    简介 Cobra既是一个用来创建强大的现代CLI命令行的golang库 也是一个生成程序应用和命令行文件的程序 下面是Cobra使用的一个演示 Cobra提供的功能 简易的子命令行模式 如 app server app fetch等等 完全
  • Java long数据类型

    long数据类型是64位有符号的Java原始数据类型 当对整数的计算结果可能超出int数据类型的范围时使用 long数据类型范围是 9 223 372 036 854 775 808至9 223 372 036 854 775 807 2
  • JUC详细笔记

    此笔记根据黑马JUC课程整理 1 JUC概述 1 1什么是juc 在 Java 中 线程部分是一个重点 本篇文章说的 JUC 也是关于线程的 JUC就是 java util concurrent 工具包的简称 这是一个处理线程的工具包 JD
  • XHS信号和XVS信号

    XHS信号和XVS信号 camera的总体示意图如下 控制部分为摄像头上电 IIC控制接口 数据输出为摄像头拍摄的图像传到主控芯片 所有要有DATA 行场同步和时钟信号 摄像头有两种同步方式 行同步信号 HSYNC 和场同步信号 VSYNC
  • 分类问题的评价指标:二分类【准确率(Accuracy):用在数据均衡(每一类的样本数量相同)的数据集上】【精确率(Precision)】【召回率(Recall)】【F1】

    一 混淆矩阵 对于二分类的模型 预测结果与实际结果分别可以取0和1 我们用N和P代替0和1 T和F表示预测正确和错误 将他们两两组合 就形成了下图所示的混淆矩阵 注意 组合结果都是针对预测结果而言的 由于1和0是数字 阅读性不好 所以我们分
  • OpenGL系列教程之十二:OpenGL Windows图形界面应用程序

    这篇文章是关于使用MVC Model View Controller 模型 视图 控制 框架在windows平台下创建OpenGL图形界面应用程序 MVC框架在GUI Graphic User Interface 图形用户界面 应用程序中被
  • Docker之数据卷与Dockerfile

    一 docker基本运行 将容器后台运行并进入容器 docker run itd name 名字 centos 强制删除所有容器 docker rm f docker ps a 二 数据卷 目录挂载 docker在容器中管理数据主要有两种方
  • 【计算机网络】Linux环境中的TCP网络编程

    文章目录 前言 一 TCP Socket API 1 socket 2 bind 3 listen 4 accept 5 connect 二 封装TCPSocket 三 服务端的实现 1 封装TCP通用服务器 2 封装任务对象 3 实现转换
  • python高阶函数用法之map reduce

    map 函数 接收两个参数 一个是函数 一个是Iterable map将传入的函数依次作用到序列的每个元素 并把结果作为新的Iterator返回 gt gt gt def f x return x x gt gt gt r map f 1
  • 一直没懂PCB叠层设计,直到看见这篇文章......

    总的来说叠层设计主要要遵从两个规矩 每个走线层都必须有一个邻近的参考层 电源或地层 邻近的主电源层和地层要保持最小间距 以提供较大的耦合电容 下面列出从两层板到八层板的叠层来进行示例讲解 一 单面PCB板和双面PCB板的叠层 对于两层板来说
  • Python-文件操作

    Python文件操作 1 打开文件 使用open 函数打开文件 指定文件名和模式 常用模式有 r 读取 默认 w 写入 会先截断文件 a 追加 b 二进制模式 t 文本模式 默认 updating reading and writing f
  • titanic数据集_数据挖掘项目——泰坦尼克号生还预测

    数据集来源于kaggle经典竞赛数据集 一 目的 根据数据集中的信息 利用python机器学习对泰坦尼克乘客是否生还进行预测 二 数据集 我的数据集有三个 test train genderclassmodel 都是csv格式 test和t
  • stm32f4有重映射么_STM32 端口复用&重映射(USART Remap)

    下面跟大家说一下STM32单片机的端口重映射 因为是以自己为实例 这里是以USART1的重映射为例 因为我要一个TFT LCD屏的主控板 考虑到FSMC 我选用了STM32F103VCT6 型号的CPU 一不小心串口接到USART1上了 因
  • networkx画图(番外)——(1)自定义节点布局

    networkx画图 番外 1 自定义节点布局 networkx虽然非常方便 但在一些超大规模的图数据上 依然显得吃力 所以大多数时候 它仅仅是被用来做一些实例性的分析和可视化展示的 这需要学会如何灵活的画图 最重要的就是布局 即每个节点在
  • word中导入zotero的参考文献

    平时使用Zotero管理文献 使用Word写完论文后想用Zotero导入参考文献 也方便修改参考文献格式 Zotero 打开Zotero找到编辑 首选项 打开首选项 下载国标格式 引用 获取更多样式 搜索框 China Word Word中
  • 技术学习的思考

    学习新的技术 先了解这项技术有什么用 可以解决哪些技术难点 落地这项技术的场景 以及和其他技术的对比 和提出自己大概了解这项技术后存在的疑问 o 例如核间通讯IPC与芯片间通讯ICC有什么区别 对要学的技术梳理出一个框架 根据这个框架先找到
  • 数仓建模—宽表的设计

    宽表的设计 高内聚低耦合 宽表是数仓里面非常重要的一块 数仓是分层的 这是技术进步和时代变化相结合的产物 数仓的分层式为了更好地管理数仓以及更加高效地进行数据开发 宽表主要出现在dwd 层和报表层 当然有的人说dws 层也有 宽表 从字面意