大数据架构之关系型数据仓库——解读大数据架构(二)

news2024/11/23 15:49:24

文章目录

    • 前言
    • 什么是关系型数仓
    • 对数仓的错误认识与使用
    • 自上而下的方法
    • 关系型数仓的优点
    • 关系型数仓的缺点
    • 数据加载
      • 加载数据的频率
      • 如何确定变更数据
    • 关系型数仓会消失吗
    • 总结

前言

本文对关系型数据仓库(RDW)进行了简要的介绍说明,包括什么是关系型数据仓库,以及为什么要使用关系型数据仓库,其优缺点有哪些,如何增量更新数据等,最后还讨论了关系型数据仓库是否会消失的问题,以及哪些人会继续使用关系型数据仓库。

什么是关系型数仓

关系型数仓(RDW是集中存储和管理从多个数据源复制的大量结构化数据的地方,用于历史和趋势分析报表,以便公司可以做出更好的业务决策。之所以称为关系型,是因为它基于关系模型,这是一种广泛使用的数据库数据表示和组织方法。在关系模型中,数据被组织成表(也称为关系)。这些表由行和列组成,其中每行代表一个实体(例如客户或产品),每列代表该实体的一个属性(例如名称、价格或数量)。它被称为数据仓库,因为它收集、存储和管理来自各种来源的大量结构化数据,例如事务数据库、web 应用程序系统和外部数据源。

并非所有数据仓库都基于关系模型, 非关系型数据仓库包括柱状数据仓库、NoSQL 数据仓库和图数据仓库等类型。然而,关系数据仓库更受欢迎并被广泛采用,主要是因为关系数据库几十年来一直是占主导地位的数据管理范例。关系模型非常适合业务应用程序中常见的结构化数据。它还由于 SQL 的广泛使用而流行,多年来 SQL 一直是关系数据仓库的标准语言。

RDW 充当许多主题领域的中央存储库,并提供唯一版本真实数据(SVOT), SVOT 是数据仓库中的一个关键概念,指的是为公司提供统一,一致的数据视图。这意味着数据仓库中的所有数据都以标准化、结构化的格式存储,并能表示数据版本的唯一、准确。这确保所有用户都可以访问相同的数据,消除任何差异或不一致,并消除数据孤岛。这改善了整个组织的决策、协作和效率。它还降低了因使用不同的、不一致的数据源而可能出现的错误和误解的风险。

想象一下,如果没有数据仓库,而是直接从多个源系统生成报表,甚至可能是一些 Excel 文件。如果报表查看者质疑数据的准确性,你可以告诉他们什么? “真实”可能分散在如此多的源系统中,以至于很难追踪数据的来源。此外,某些报告会对相同的数据给出不同的结果,例如,如果两个报告使用复杂的逻辑从多个源提取数据,并且逻辑更新不正确(或根本不更新)。将所有数据集中在一个中心位置意味着数据仓库是唯一的真实数据来源,有关报表数据的任何问题都可以由数据仓库来解答。对于希望充分利用数据价值的公司来说,维护 SVOT 至关重要。

如果整个公司都使用数据仓库 (DW),则通常将数仓叫做企业数据仓库(EDW)。这是一个更全面、更强大的数据仓库版本,旨在支持整个组织的需求。虽然标准数据仓库可能支持几个业务部门,但整个公司内有许多数据仓库,而 EDW 使用更广泛的数据源和数据类型来支持所有业务部门。 EDW 提供了公司所有数据的单一、统一视图。

下图说明了拥有数据仓库的主要原因。左图显示了在没有数据仓库的情况下使用来自多个应用程序的数据运行报表是多么具有挑战性。每个部门都会运行一份报表,从与每个应用程序关联的所有数据库采集数据。运行的查询如此之多,必然会出现性能问题和不正确的数据。右图显示,将所有应用程序数据复制到 EDW 后,每个部门都可以非常轻松地运行报告,而不会影响性能。

通常,要构建数据仓库,数据管道将执行三个步骤,称为提取、转换和加载 (ETL):

  1. 该管道从源系统中提取数据,例如数据库和普通文件
  2. 然后,对提取的数据进行转换或其他操作,以满足目标系统的要求。这可能涉及数据清洗、过滤、聚合或组合来自多个来源的数据。
  3. 转换后的数据被加载到数据仓库中。 DBA 可以使数据库和字段名称更有意义,使最终用户更轻松、更快速地创建报表。

对数仓的错误认识与使用

上边说明了什么叫数仓,下边列举了对数仓的错误认识,进而导致的错误使用:
直接复制源表加上DW 前缀

  • 数仓不是源表的副本,数仓中的表是用来数据分析的,直接将数据源的表复制一份至数仓,然后加上DW 前缀是无意义的。

作为多个表的 union 视图

  • 将多个数据源的表直接复制到数仓,然后在数仓中通过 Union 多张表查询视图,比如说有三个数据源的表分别为 t1, t2, t3, 然后复制到数仓创建 dw_t1, dw_t2, dw_t3 表,然后需要创建一张报表需要用到这三张视图,就在数仓中使用 Union 联合查询,这是错误的做法。

相反,我们需要在数仓中建模,然后将外部多个数据源表中的数据复制到数仓的一个模型表中,供分析查询。
单纯作为外部源数据的集中存储

  • 还有更极端的错误做法就是把数仓单纯作为一个外部数据源的集中存储地,不断的往数仓中添加乱七八糟的,未经建模整理的外部源数据,用垃圾场来形容毫不为过,试想一下,让我们从垃圾场去找东西方便吗?

许多数仓在一开始只是为几个用户提供的一次性解决方案,随着用户的增多,演变成为整个公司提供数据的成熟但设计不佳的数据仓库。其实在一开始的时候,数仓就需要确定每一次的数据接入是否为一次性的,是否应该在前期花费一些必要的时间去进行数据建模,让数仓的表更加抽象化,进而后期可以支持接入更多的数据源。

自上而下的方法

在 RDW 中,我们需要预先做大量工作才能将数据传输到可以使用它来创建报表的位置。预先完成所有这些工作是一种称为自上而下方法的设计和实现。这种方法非常适合查询历史数据创建报表,在这种报表中,我们试图确定发生了什么(描述性分析)以及发生的原因(诊断分析)。

在自上而下的方法中,首先建立数据仓库的总体规划、设计和架构,然后开发具体的组件。该方法强调在深入开发数据仓库之前制定符合整个公司的愿景并了解公司的战略目标和数据需求的重要性。

描述性分析诊断分析是商业中常用的两种重要的数据分析类型。

描述性分析涉及分析数据以描述过去或当前的事件,通常通过使用汇总统计或数据可视化。此类分析用于了解过去发生的情况,并识别数据中有助于决策的模式或趋势。

诊断分析通常通过检查不同变量或因素之间的关系来调查过去事件的原因。此类分析可以定位问题原因或推断可能影响业务发展的问题。

假设一家公司想要分析过去一年的销售数据。描述性分析将涉及计算汇总统计数据,例如总销售收入、每日平均销售额以及按产品类别划分的销售额,以了解发生的情况。相比之下,诊断分析将检查因素(例如销售和营销支出,或季节性和客户人口统计)之间的关系,以了解销售额全年波动的原因。通过结合这两种方法,公司可以更深入地了解其数据并做出更明智的决策。

关系型数仓的架构如下图所示,ETL 用于将多个来源的数据提取到 RDW 中,在其中可以执行报告和其他分析。
自上而下的方法通常涉及以下步骤:

  1. 预先提出一些假设

    首先要清楚地了解公司战略, 然后确保知道要对数据提出哪些问题。

  2. 定义业务需求

    确定组织的目的、目标和关键绩效指标 (KPI)。收集并分析各部门和用户的数据需求,还可以将此步骤视为定义报表的要求。

  3. 设计数据仓库架构

    根据业务需求,创建数据仓库的高层架构,包括数据仓库的结构、数据模型和数据集成流程。

  4. 开发数据模型

    为数据仓库设计详细的数据模型,考虑各种数据实体之间的关系和数据的粒度。

  5. 构建架构

    为数据仓库开发适当的数据库、写时 schema、表和字段。

  6. 开发ETL

    开发 ETL 流程以从各种源系统中提取数据,将其转换为所需的格式,并将其加载到数据仓库中。

  7. 开发和部署BI工具和应用程序

    构建部署 BI 工具,允许用户访问、分析和报表创建。

  8. 测试和完善数据仓库

    执行测试以确保数据质量、性能和可靠性。进行必要的调整以优化系统。

  9. 维护和扩展数据仓库

    随着组织需求的发展,相应地更新和扩展数据仓库。
    自上而下的方法具有一些优点,例如全面了解组织的数据需求、更好的数据一致性以及改进的治理。然而,它也可能非常耗时且资源密集,与数据湖使用的自下而上的方法相比,需要更长的时间才能产生价值。

关系型数仓的优点

关系型数仓最直接的好处就是可以快捷,方便的生成 BI 报表,还有一些别的好处:

  • 减轻业务方生产系统的压力

    分析报表查询,不经过业务方的数据库系统。

  • 读取速度快

    数仓的表是一次写入多次读取,意味着数仓的数据库技术可以针对查询做一些优化,加速查询速度。

  • 整合多个数据源

    将多个数据源的数据集中在一个查询入口,减少报表构建的复杂度,提升报表查询的性能。

  • 历史数据保存

    数仓保存加载的源数据的历史数据记录,支持需要查询历史数据构建报表。

  • 整合重构业务表元信息

    许多应用程序数据库的表名和字段名非常难以理解,尤其是较旧的 ERP 和 CRM 产品(例如表名T116和字段名RAP16)。在数据仓库中,我们可以将这些源表中的数据以更加容易理解的方式复制到数仓(例如,Customer而不是T116)。还可以为表创建更好的数据模型,用户不必翻译神秘的表和字段名称,能够更轻松地创建报表。

  • 防止业务表变更对报表的影响

    如果直接从业务表查询数据构建报表,当业务表元信息变更后,报表将变得不可用。通过数仓构建报表则不会有这种影响,最多报表无法查询最新的业务数据构建报表,但是历史的报表是可以继续查看的。
    当数仓的 ETL 适应业务方的业务表变更进行修复后,就可以继续查询最新的报表了。

  • 提供数据安全保障

    如果没有 DW,将需要给用户提供生成报表所需的各个数据源的访问权限,可能有几十个,提供访问权限的过程可能需要数周时间。使用数据仓库,每个用户只需要申请一个统一的查询入口,即可根据权限访问对应的数据库表,效率高。

  • 保证数据质量

    数仓从各个数据源获取到的数据往往都需要经过清洗,保证生成报表的数据质量。

关系型数仓的缺点

  • 复杂

    数据仓库的设计、构建和维护可能非常复杂且耗时。所需的专业技能和资源可能会增加成本。

  • 成本高

    实施数据仓库的成本可能很高,需要在硬件、软件和人员方面进行大量投资。持续的维护和升级也会增加成本。

  • 数据集成难度高

    集成来自不同来源的数据可能具有挑战性,因为它可能涉及处理不同的数据格式、结构和质量问题。这可能会导致在数据清理和预处理上花费时间和精力。此外,某些数据(例如来自物联网设备的流数据)太难提取到 RDW 中,因此从这些数据中获得的潜在价值就会丢失。

  • 数据转换耗时

    为了将数据加载到 DW 中,可能需要对其进行转换以符合仓库的数据模型。此过程可能非常耗时,并且数据转换中的错误可能会导致分析不准确。

  • 数据延迟

    由于数据仓库设计用于处理大量数据,因此它们的处理速度可能比其他类型的数据库慢。这可能会导致数据延迟,即仓库中的数据不是最新的源数据库的最新数据。

  • 维护期间不可用

    对于 RDW,通常需要一个维护时段。加载和清理数据非常耗费资源,如果用户再次期间尝试同时运行报表查询,他们将遇到性能非常低的情况。因此,在维护期间,用户不可用。如果在维护时段期间出现任何问题,例如 ETL 作业失败,可能需要延长维护时段。如果用户尝试运行报表查询但仍然不可用,会降低用户的信任度。

  • 灵活性有限

    DW 旨在支持特定类型的分析,这可能会限制其其他类型数据处理或分析的灵活性。可能需要将其他工具或系统与仓库集成以满足特定需求。

  • 存在安全和隐私问题

    在集中位置存储大量敏感数据可能会增加数据泄露和隐私侵犯的风险,因此需要采取强有力的安全措施。

数据加载

由于输入数据仓库的源表会随着时间的推移而发生变化,因此数据仓库需要反映这些变化。这听起来很简单,但是需要做出许多决定:加载(或拉取)数据的频率、使用什么提取方法、如何加载数据以及如何确定自上次加载以来哪些数据已更改。

加载数据的频率

需要多久更新一次 DW 在很大程度上取决于源系统数据的更新频率以及用户需要报表创建的时效性。用户通常不想查看当天的数据,而更愿意获取前一天结束时的所有数据。在这种情况下,可以在源系统数据库完成更新后每天晚上运行作业以通过 ETL 工具从源系统中加载数据,从而创建一个夜间维护窗口来完成所有数据传输。如果最终用户在白天需要更新,则需要更频繁的加载,例如每小时一次。

需要考虑的一件事是每次加载的数据大小。如果它非常大,更新 DW 可能会花费太长时间,因此可能希望将更新拆分为更小的块并进行更频繁的加载和更新(例如,每小时而不是每天)。

写入方式
有两种从源系统提取数据的方法:
全量加载

  • 在全量加载中,所有数据都是从源系统中的一个或多个表中完全加载的。由于这种记载反映了源系统上当前可用的所有数据,因此无需跟踪更改,使得该方法非常容易构建。源数据按原样提供,不需要任何其他信息(例如时间戳)。

增量加载

  • 在增量加载中,仅加载自指定时间(例如上次加载结束)以来发生更改的数据,而不是整个表。这最适合大型表,并且仅当可以识别所有更改的信息时才有效。

无论是进行全量加载还是增量加载,都有两种加载数据的方法:在线和离线。

在在线加载中,加载过程可以直接连接到源系统以访问源表,也可以连接到以预先配置的方式(例如,在事务日志或更改表中)存储数据更改的中间系统。

但是,并不是一直可以直接访问源系统。在这种情况下,数据将暂存于原始源系统之外,加载的数据通常被放在 CSV 或 JSON 等文件中。

如何确定变更数据

时间戳

  • 业务系统的表最好带上更新时间字段

变更数据获取

  • 大多数关系数据库支持更改数据捕获(CDC),它记录数据库表的INSERTsUPDATEs 等变更操作,并根据关系数据库的事务日志使表记录更改内容、位置和时间。如果需要近乎实时的数据仓库,可以在几秒钟内看到数据仓库中反映的源系统的更改,那么 CDC 可能是关键的支持技术。

分区

  • 业务系统的表如果按照时间分区,那么数仓在加载数据时可以指定分区,加载指定日期的数据。

变更触发器

  • 业务表也可以通过设置变更触发器,将变更数据写入“变更表”,然后数仓加载变更表中的数据。如果数据库支持CDC,最好还是使用 CDC 加载变更数据。

数仓 Merge 更新

  • 如果没有其他方式,数仓可以加载全量数据,然后在数仓内执行 Merge 操作,对比源字段与目标字段。但是该方法将会严重增加数仓的负担,不建议使用。

关系型数仓会消失吗

大约在 2010 年代初,互联网界就开始讨论是否还需要关系型数据仓库的问题,该问题实际上是关于数据仓库架构的——可以只使用数据湖,还是应该同时使用数据湖和 RDW?

我一直觉得 RDW 是需要的,因为数据湖是基于 Hadoop 的,并且有太多限制。但是,一旦 Delta Lake等解决方案变得可用,并且数据湖开始出现使用比 Hadoop 更好、更易于使用的产品时,RDW 可能会慢慢退出历史的舞台,目前比较成熟的解决方案是湖仓一体方案,笔者公司现在就在探索使用 Flink+Paimon 的湖仓一体方案,可以完全抛弃 Hadoop 那一套,使用更加方便。

数据湖为数据科学家和自定义数据消费用户(“高级用户”)提供丰富的数据源,并且可以很好地满足分析和大数据的需求。但高级用户并没有那么多,大多数人仍然需要集成良好、系统清理、易于访问的关系数据,其中包括获取一段时间内事物如何演变或进展的历史日志。这些人最适合使用关系型数据仓库。

总结

本文介绍了大数据架构第一个广泛使用的技术解决方案,用于集中多个来源的数据并对其进行报告:关系数据仓库。 RDW 通过提供用于数据存储和检索的集中存储库,彻底改变了企业和组织管理数据的方式,从而实现更高效的数据管理和分析。 RDW 能够以结构化方式存储和组织数据,允许用户快速轻松地生成复杂的查询和报表,从而提供有价值的信息并支持关键决策。

如今,关系数据仓库仍然是许多数据架构的基本组成部分,并且可以在从金融和医疗保健到零售和制造的各个行业中看到。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1590192.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《由浅入深学习SAP财务》:第2章 总账模块 - 2.6 定期处理 - 2.6.5 年末操作:维护新财政年度会计凭证编号范围

2.6.5 年末操作:维护新财政年度会计凭证编号范围 财务系统的维护者要在每年年末预先设置好下一年度的会计凭证编号范围(number range),以便下一年度会计凭证能够顺利生成。这一操作一定要在下一年度1月1日以前预先完成。 …

C#/.NET/.NET Core拾遗补漏合集(24年4月更新)

前言 在这个快速发展的技术世界中,时常会有一些重要的知识点、信息或细节被忽略或遗漏。《C#/.NET/.NET Core拾遗补漏》专栏我们将探讨一些可能被忽略或遗漏的重要知识点、信息或细节,以帮助大家更全面地了解这些技术栈的特性和发展方向。 GitHub开源地…

【MoS2】应变增强的单层MoS2光电探测器

这篇文章的标题是《Strain-Enhanced Large-Area Monolayer MoS2 Photodetectors》,作者是Borna Radatovic等人,发表在《ACS Applied Materials & Interfaces》期刊的2024年第16卷。文章主要研究了应变增强的大面积单层MoS2光电探测器的性能和应用潜力…

基于SpringBoot的“汉服文化平台网站”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“汉服文化平台网站”的设计与实现(源码数据库文档PPT) 开发语言:Java 数据库:MySQL 技术:SpringBoot 工具:IDEA/Ecilpse、Navicat、Maven 系统展示 系统功能结构图 系统功能界面图 用户登录、用…

Java并发(1)--线程,进程,以及缓存

线程和进程是什么? 进程 进程是程序的一次执行过程,系统程序的基本单位。有自己的main方法,并且主要由主方法运行起来的基本上就是进程。 线程 线程与进程相似,但线程是一个比进程更小的执行单位。一个进程在其执行的过程中可以…

ARM64架构栈帧回溯

文章目录 前言一、栈帧简介二、demo演示 前言 请参考:ARM64架构栈帧以及帧指针FP 一、栈帧简介 假设下列函数调用: funb() {func() }funa() {funb() }main() {funa() }main函数,funa函数,funb函数都不是叶子函数,其…

PostgreSQL数据库基础--简易版

数据库 其中runoobdb为数据库名 查看已经存在的数据库 \l进入数据库 \c runoobdb创建数据库 CREATE DATABASE runoobdb;删除数据库 DROP DATABASE runoobdb;表 其中COMPANY为表名 创建表格 CREATE TABLE COMPANY(ID INT PRIMARY KEY NOT NULL,NAME TEXT…

lua学习笔记21完结篇(lua中的垃圾回收)

print("*****************************lua中的垃圾回收*******************************") text{id24,name"仙贝"} --垃圾回收关键字collectgarbag --获取当前lua占用内存数 k字节 返回值*1024就可以得到具体占用字节数 print(collectgarbage("count&…

解释器模式:专为语言处理定制的模式

在软件开发中,解释器模式是一种特定的行为型设计模式,它用于定义一种语法,并提供一个解释器来解释这种语法或表达式。这种模式用于专门的情况,当有一个简单的语言需要解释时,它可以被用来表达实例的规则。本文将详细介…

mybaits(8)-缓存机制

缓存机制 1、mybatis缓存2、一级缓存2.1 开启一级缓存2.2 一级缓存失效 3、二级缓存3.1 开启二级缓存3.2 二级缓存什么时候失效3.3 二级缓存的相关配置 4、MyBatis集成EhCache 1、mybatis缓存 缓存:cache 缓存的作用:通过减少IO的方式,来提高…

C++项目——集群聊天服务器项目(十四)客户端业务

大家好~前段时间有些事情需要处理,没来得及更新,实在不好意思。 今天来继续更新集群聊天服务器项目的客户端功能,主要实现客户端业务,包括添加好友、点对点聊天、创建群组、添加群组、群组聊天业务,接下来我们一起来敲…

Promise简单概述

一. Promise是什么? 理解 1.抽象表达: Promise是一门新的技术(ES6规范) Promise是JS中进行异步编程的新解决方案(旧方案是单纯使用回调函数) 异步编程:包括fs文件操作,数据库操作(Mysql),AJAX,定时器 2.具…

【opencv】示例-imagelist_creator.cpp 从命令行参数中创建一个图像文件列表(yaml格式)...

/* 这个程序可以创建一个命令行参数列表的yaml或xml文件列表 */ // 包含必要的OpenCV头文件 #include "opencv2/core.hpp" #include "opencv2/imgcodecs.hpp" #include "opencv2/highgui.hpp" #include <string> #include <iostream>…

24、链表-回文链表

思路&#xff1a; 回文链表就是两个指针各从首 尾 开始遍历&#xff0c;实时相等&#xff0c;那么就是回文链表&#xff0c;或者关于中线对称。 第一种方式 集合方式实现很简单不再赘述&#xff0c;代码如下 //直接使用一个栈来校验&#xff0c;回文正过来 逆过来 都一样&am…

Go——Goroutine介绍

一. 并发介绍 进程和线程 进程是程序在操作系统中一次执行过程&#xff0c;系统进程资源分配和调度的一个独立单位。线程是进程执行的实体&#xff0c;是CPU调度和分派的基本单位&#xff0c;它是比进程更小的能独立运行的基本单位。一个进程可以创建和撤销多个线程&#xff0c…

221 基于matlab编制的直齿圆柱齿轮应力计算程序

基于matlab编制的直齿圆柱齿轮应力计算程序&#xff0c;输入设计参数&#xff1a;模数、齿顶高、齿宽、啮合齿数、转速、扭矩、安全系数、压力角、齿轮类型&#xff08;开式、闭式&#xff09;等&#xff0c;输出弯曲应力和许用应力&#xff0c;并对比是否满足要求。并把程序成…

【二分算法】

17. 二分查找&#xff08;easy&#xff09; 算法流程&#xff1a; 算法代码&#xff1a; int search(int* nums, int numsSize, int target) {// 初始化 left 与 right 指针int left 0, right numsSize - 1;// 由于两个指针相交时&#xff0c;当前元素还未判断&#xff0c;因…

在Ubuntu服务器上快速安装一个redis并提供远程服务

一、快速安装一个Redis 第一步&#xff1a;更新apt源 sudo apt update第二步&#xff1a;下载Redis sudo apt install redis第三步&#xff1a;查看Redis是否已自启动 systemctl status redis二、配置Redis提供远程服务 第一步&#xff1a;先确保6379端口正常开放 如果是…

客户端传日期格式字段(String),服务端接口使用java.util.Date类型接收报错问题

客户端传日期格式字段&#xff08;string&#xff09;,服务端接口使用java.util.Date类型接收报错问题 问题演示第1种&#xff1a;客户端以URL拼接的方式传值第2种&#xff1a;客户端以body中的form-data方式提交第3种 客户端以Body中的json方式提交 问题解决&#xff08;全局解…

【SpringBoot XSS存储漏洞 拦截器】Java纯后端对于前台输入值的拦截校验实现 一个类加一个注解结束

先看效果&#xff1a; 1.js注入拦截&#xff1a; 2.sql注入拦截 生效只需要两步&#xff1a; 1.创建Filter类&#xff0c;粘贴如下代码&#xff1a; package cn.你的包命.filter; import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.IO…