数仓建模宽表设计

2023-10-27

一、宽表的设计

其实宽表是数仓里面非常重要的一块,前面我们介绍过了维度表事实表,今天我们介绍一下宽表,前面我们说过了数仓是分层的,这是技术进步和时代变化相结合的产物,数仓的分层式为了更好地管理数仓以及更加高效地进行数据开发。

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

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

1.1、为什么要建设宽表

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

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

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

可以提高开发效率

一般情况下,我们的宽表包含了很多相关的数据,如果我们在宽表的基础上做一些开发,那就很方便,我们直接从宽表里面取数据,避免了我们从头计算,你设想一下你要是没次都从ods开发一张报表,那是多痛苦的体验啊。

可以提高数据质量

宽表的准确性,一般都是经历了时间的检验的,逻辑错误的可能性很小,可以直接使用,要是让你从头开发,那这个过程中可能因为对业务理解不透彻或者是书写的逻辑不正确,导致有数据质量问题

可以统一指标口径

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

1.2、宽表的好处和不足

宽表的好处就是我们前面提到过的我们为什么要建设宽表的原因,接下来我们看一下宽表的不足

性能不高

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

稳定性不高

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

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

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

开发难度大/维护成本高

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

二、如何设计宽表

宽表的好处和不足我们都讲了,也就是说宽表虽好,但是带来的问题也很多,下面我们就看一下如何从设计的角度来避免宽表的不足之处

2.1、宽表到底多宽

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

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

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

2.2、主次分类

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

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

2.3、冷热分离

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

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

2.4、稳定与不稳定分离

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

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

三、总结

主要讲解了一下几个方面

  1. 为什么要建设宽表

  2. 宽表的不足

  3. 如何设计宽表

    1. 宽表到底多宽

    2. 主次分离

    3. 冷热分类

    4. 稳定与不稳定分类

设计宽表的理论其实说白了就是一句话高内聚低耦合,当然这几个字你在其他领域可能很熟悉了,但是这里你就好好思考一下才能想通,我一直新信奉的是一力降十会 一拙破万巧 也就是说你要学会根本的东西,才能举一反三破万难。

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

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

  • 我可以在没有 Hadoop 的情况下使用 Spark 作为开发环境吗?

    我对大数据和相关领域的概念非常陌生 如果我犯了一些错误或拼写错误 我很抱歉 我想了解阿帕奇火花 http spark apache org 并使用它仅在我的电脑中 在开发 测试环境中 由于Hadoop包含HDFS Hadoop分布式文件系统
  • Sqoop - 绑定到 YARN 队列

    因此 使用 MapReduce v2 您可以使用绑定到某些 YARN 队列来管理资源和优先级 基本上通过使用 hadoop jar xyz jar D mapreduce job queuename QUEUE1 input output
  • HDFS 中的文件数量与块数量

    我正在运行单节点 hadoop 环境 当我跑的时候 hadoop fsck user root mydatadir block 我真的对它给出的输出感到困惑 Status HEALTHY Total size 998562090 B Tot
  • 更改 Spark Streaming 中的输出文件名

    我正在运行一个 Spark 作业 就逻辑而言 它的性能非常好 但是 当我使用 saveAsTextFile 将文件保存在 s3 存储桶中时 输出文件的名称格式为 part 00000 part 00001 等 有没有办法更改输出文件名 谢谢
  • 2n + 1 法定人数是什么意思?

    我在描述 HBase 的 Zookeeper 配置时遇到过这个问题 但我对这个术语并不熟悉 N 与我的 HBase 集群中的节点数量有关系吗 或者我应该在 Zookeeper 集群中使用的节点数量 2f 1是指你所需要的可靠性 可用性水平
  • 无法在 Hadoop Map-Reduce 作业中加载 OpenNLP 句子模型

    我正在尝试将 OpenNLP 集成到 Hadoop 上的 Map Reduce 作业中 从一些基本的句子分割开始 在地图函数中 运行以下代码 public AnalysisFile analyze String content InputS
  • java.lang.ClassNotFoundException:找不到类 org.apache.hadoop.fs.azurebfs.SecureAzureBlobFileSystem

    我是 Spark 和 Kubernetes 世界的新手 我使用 docker image tool sh 实用程序使用与 Hadoop 3 2 捆绑在一起的官方 Spark 3 0 1 构建了 Spark docker 映像 我还为 Jup
  • hive 添加分区语句忽略前导零

    我在 hdfs 上有文件夹 user test year 2016 month 04 dt 25 000000 0 需要将上面的分区路径添加到test table 命令 ALTER TABLE test ADD IF NOT EXISTS
  • 无法验证 serde:org.openx.data.jsonserde.jsonserde

    我编写了这个查询来在配置单元上创建一个表 我的数据最初是 json 格式 所以我已经下载并构建了 serde 并添加了它运行所需的所有 jar 但我收到以下错误 FAILED Execution Error return code 1 fr
  • Sqoop 导出分区的 Hive 表

    我在尝试导出分区的 Hive 表时遇到了一些问题 这是否完全受支持 我尝试用谷歌搜索并找到一张 JIRA 票证 sqoop export connect jdbc mysql localhost testdb table sales exp
  • 是否可以使用 Java 读写 Parquet,而不依赖 Hadoop 和 HDFS?

    我一直在寻找这个问题的解决方案 在我看来 如果不引入对 HDFS 和 Hadoop 的依赖 就无法在 Java 程序中嵌入读写 Parquet 格式 它是否正确 我想在 Hadoop 集群之外的客户端计算机上进行读写 我开始对 Apache
  • 更改 Hadoop 中的数据节点数量

    如何改变数据节点的数量 即禁用和启用某些数据节点来测试可扩展性 说得更清楚一点 我有4个数据节点 我想一一实验1 2 3 4个数据节点的性能 是否可以只更新名称节点中的从属文件 临时停用节点的正确方法 创建一个 排除文件 这列出了您想要删除
  • 适用于 Python 3.x 的 Hive 客户端

    是否可以使用 Python 3 x 连接到 hadoop 并运行 hive 查询 我正在使用Python 3 4 1 我发现可以按照这里写的方式完成 https cwiki apache org confluence display Hiv
  • 使用 org.apache.hadoop/* 依赖项离线编译 sbt 时遇到的问题

    使用依赖于 org apache hadoop 包的 sbt 进行离线编译时遇到很多麻烦 一个简单的build sbt name Test version 1 0 scalaVersion 2 10 4 libraryDependencie
  • 为什么我们需要将外部表移动到托管 Hive 表?

    我是 Hadoop 新手 正在学习 Hive 在 Hadoop 权威指南第 3 版中 第 12 页 第428章 最后一段 我不明白下面关于 HIVE 中外部表的段落 一种常见的模式是使用外部表访问存储在 HDFS 中的初始数据集 由另一个进
  • ETL informatica 大数据版(非云版)可以连接到 Cloudera Impala 吗?

    我们正在尝试在 Informatica 大数据版本 不是云版本 上进行概念验证 我发现我们可能能够使用 HDFS Hive 作为源和目标 但我的问题是 Informatica 是否连接到 Cloudera Impala 如果是这样 我们是否
  • Hadoop - 直接从 Mapper 写入 HBase

    我有一个 hadoop 作业 其输出应写入 HBase 我并不真正需要减速器 我想要插入的行类型是在映射器中确定的 如何使用 TableOutputFormat 来实现此目的 从所有示例中 我看到的假设是 reducer 是创建 Put 的
  • MapReduce 中的分区到底是如何工作的?

    我认为我总体上对 MapReduce 编程模型有一定的了解 但即使在阅读了原始论文和其他一些来源之后 我仍然不清楚许多细节 特别是关于中间结果的分区 我将快速总结到目前为止我对 MapReduce 的理解 我们有一个可能非常大的输入数据集
  • 通过Oozie命令行指定多个过滤条件

    我正在尝试通过命令行搜索一些特定的 oozie 作业 我使用以下语法进行相同的操作 oozie jobs filter status RUNNING status KILLED 但是 该命令仅返回正在运行的作业 而不是已杀死的作业 需要帮助
  • MapReduce 中 1 个任务的减速器数量

    在典型的 MapReduce 设置 如 Hadoop 中 1 个任务使用多少个减速器 例如计算单词数 我对 Google MapReduce 的理解意味着只涉及 1 个减速器 那是对的吗 例如 单词计数会将输入分为 N 个块 并且 N 个

随机推荐

  • Windows共享文件夹,让你的文件可以通过网络访问

    Windows共享文件夹 让你的文件可以通过网络访问 以windows11为例 现在有两台windows电脑A和B B想通过网络访问A的某个文件 首先保证B是可以ping的通A的 比如共享A的D盘文件夹给B访问 下面是详细步骤 A电脑的操作
  • 等价类划分法

    一 什么是等价类划分法 1 等价类划分法是一种重要的 常用的黑盒测试方法 它将不能穷举的测试过程进行合理分类 从而保证设计出来的测试用例具有完整性和代表性 2 等价类划分法是把所有可能的输入数据 即程序的输入划分成若干部分 子集 然后从每一
  • YOLOv1的原理及实现过程

    YOLO v1的原理及实现过程 目标检测是一件比较实际的且具有挑战性的计算机视觉任务 其可以看成图像分类与定位的结合 给定一张图片 目标检测系统要能够识别出图片的目标并给出其位置 由于图片中目标数是不定的 且要给出目标的精确位置 目标检测相
  • C# EntityFrameworkCore 分页

    使用 public static PagedList
  • 深入浅出分析Electron自动升级electron-updater + electron-builder配置

    自动升级的方式有很多种 我们公司第一版是使用fs做文件的下载和替换 但是存在C programfile的权限问题 因此只好更换技术方案 使用Electron builder结合updater实现自动升级功能 一 electron build
  • mysql 取绝对值_自学MySQL第六天

    今天先学习了一些内置的numeric function 第一个ROUND 顾名思义近似 四舍五入的方式呈现数值 可以选保留几位小数 如图所示 第二个TRUNCATE 不用四舍五入 强行取指定位数小数 如图 第三个CEILING 返回大于括号
  • PCL学习笔记,区域生长分割(region growing segmentation)

    在本博文中 我主要介绍如何在pcl RegionGrowing类中调用区域增长算法 首先注意一点 这里是region growing segmentation 不是color based region growing segmentatio
  • 查询linux系统中空闲内存/内存使用状态查看/剩余内存查看

    查询linux系统中空闲内存 内存使用状态查看 剩余内存查看 本文作者 宗国锋 宗国锋官方网站 转载请注明原文链接 http www zongguofeng cn 2010 0223 272 html 下面介绍使用top和free命令查看系
  • 浅析Python heapq模块 堆数据结构

    堆的定义 堆是一种特殊的树形数据结构 每个节点都有一个值 通常我们所说的堆的数据结构指的是二叉树 堆的特点是根节点的值最大 或者最小 而且根节点的两个孩子也能与孩子节点组成子树 亦然称之为堆 堆分为两种 大根堆和小根堆是一颗每一个节点的键值
  • 2021-01-25

    项目在windows系统上运用jdk tomcat部署后 js页面不显示 有哪些原因 怎么解决
  • SQL语言的规则与规范

    SQL分类 SQ语言在功能上主要分为如下三大类 DDL Data Definition Laguage 数据定义语言 这些语言定义了不同的数据库 表 视图 索引等数据库对象 还用来创建 删除 修改数据库和数据表的结构 主要的语句关键字包括C
  • Ubuntu系统下配置 Qt Creator 输入中文、配置软件源的服务器地址、修改Ubuntu系统时间

    上篇介绍了Ubuntu系统下搭建QtCreator开发环境 我们可以发现安装好的QtCreator不能输入中文 也没有中文输入法供选择 这里需要进行设置 文章目录 1 配置软件源的服务器地址 2 先配置Ubuntu系统语言 设置为中文 3
  • C300--HGU ONU 配置思路指导_方式1

    OLT正常启动完成后 串口登录 ZXAN gt enable Password zxr10 ZXAN config t ZXAN config ZXAN config show onu type 查看ONU的注册模板 如ZTE F601 Z
  • 什么是全量表,增量表,快照表,拉链表?

    这一篇文章我们的目的是搞懂这四种表的概念 闲话不多说 直接看文字 全量表 全量表没有分区 表中的数据是前一天的所有数据 比如说今天是24号 那么全量表里面拥有的数据是23号的所有数据 每次往全量表里面写数据都会覆盖之前的数据 所以全量表不能
  • Ubuntu20.04 Server调整默认分辨率

    问题引入 把一台台式机安装成Ubuntu20 04 Server版本后 发现没有界面操作不方便 又给它装了个桌面 安装完后发现HDMI接到显示器的分辨率只有800 600 而且在系统配置里还不能选择其它的分辨率配置 首先怀疑是不是显卡驱动没
  • VS Code之Vue开发常用插件

    Auto Close Tag 自动补全html标签 Auto Rename Tag 同步更改html尾标签 ESLint ESlint语法提示 settings json 文件 eslint nodePath E WebStorm 应用路径
  • openwrt不支持opkg的解决办法

    opkg是openwrt的插件安装命令 类似Ubuntu上的apt get或者centos上的yum 好多采用openwrt系统的设备 最后都把opkg裁剪掉了 如果拿到一个设备又想用opkg安装网络上下载到的ipk包 应该怎么办呢 其实也
  • Fluent Nhibernate and Stored Procedures

    sql DROP TABLE Department GO CREATE TABLE Department Id INT IDENTITY 1 1 PRIMARY KEY DepName VARCHAR 50 PhoneNumber VARC
  • 【深度学习】最全的十九种损失函数汇总

    tensorflow和pytorch很多都是相似的 这里以pytorch为例 文章目录 一 L1范数损失 L1Loss 二 均方误差损失 MSELoss 三 交叉熵损失 CrossEntropyLoss 四 KL 散度损失 KLDivLos
  • 数仓建模宽表设计

    一 宽表的设计 其实宽表是数仓里面非常重要的一块 前面我们介绍过了维度表事实表 今天我们介绍一下宽表 前面我们说过了数仓是分层的 这是技术进步和时代变化相结合的产物 数仓的分层式为了更好地管理数仓以及更加高效地进行数据开发 宽表主要出现在d