数仓知识07:数据增量更新的几种方式

这篇具有很好参考价值的文章主要介绍了数仓知识07:数据增量更新的几种方式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、增量更新的几种方式

增量更新的本质,其实是获取源表中数据变化的情况(增、删、改),然后将源表中发生的变化同步至目标表中。

不同的方式,获取源表中数据变化的情况不一样,受技术的限制、表结构的限制,某些方式可能无法获取到完整的数据变化情况,因此只能适用于特定的场景。

方式 简述 适用场景 详述 优点 缺点
时间戳增量1

记录每次读数完成时的最大时间戳,后续读数时只获取源头表中新增的数据,将其增量写入到目标表。

  1. 源表只增不删不改
  2. 源表有时间戳标记新增的数据
  1. 第一次从源头表读取数据的动作完成之后,记录一下时间戳字段中最大的时间点,保存到一个记录表中。
  2. 第二次从源头表读取数据之前,先获取记录表中最后/最大的时间点,只读取源表中这个时间点以后的数据。
  3. 当加载过程全部成功完成之后再更新加载记录表,更新这次最后的时间点。
性能好
  • 不能捕获删除和变化的数据
  • 部分源头表无时间戳字段
时间戳增量2 通过时间戳获取源头表新增和修改的数据,然后将其写入到目标表。
  1. 源表只增、改,不删
  2. 源表有时间戳标记新增和变化的数据
  1. 从源头表首次完成取数后,记录最大的 UpdateDate 时间戳,保存到一个记录表中。
  2. 第二次读数时,用记录表中的时间戳与源表里的 UpdateDate 时间戳相比较,比时间戳大的说明是源头表中新添加的或者修改的数据。对这部分数据进行取数。
  3. 从源头表取数完成后,更新最大的 UpdateDate到记录表中。
  4. 后续取数的逻辑,以此类推。
  1. 增量抽取时,抽取进程通过比较上次存档的时间与抽取源表的时间戳字段的值来决定抽取哪些数据。这种方式需要在源表上增加一个时间戳字段,系统中更新修改表数据的时候,同时修改时间戳字段的值。
  2. 有的数据库(例如Sql Server)的时间戳支持自动更新,即表的其它字段的数据发生改变时,时间戳字段的值会被自动更新为记录改变的时刻。在这种情况下,进行ETL实施时就只需要在源表加上时间戳字段就可以了。对于不支持时间戳自动更新的数据库,这就要求业务系统在更新业务数据时,通过编程的方式手工更新时间戳字段。
  3. 使用时间戳方式可以正常捕获源表的插入和更新操作,但对于删除操作则无能为力,需要结合其它机制才能完成。
性能尚可,能够获取改动的源头数据
  • 不能捕获删除的数据
  • 部分源头表无时间戳字段
触发器 为抽取的表建立触发器,一般要建立插入、修改、删除三个触发器,源头表的数据发生变化时,触发器将变化的数据写入临时表,抽取线程再从临时表中抽取数据。 所有场景
  1. 该方式是根据抽取要求,在要被抽取的源表上建立插入、修改、删除3个触发器,每当源表中的数据发生变化,就被相应的触发器将变化的数据写入一个增量日志表,ETL的增量抽取则是从增量日志表中而不是直接在源表中抽取数据,同时增量日志表中抽取过的数据要及时被标记或删除。
  2. 为了简单起见,增量日志表一般不存储增量数据的所有字段信息,而只是存储源表名称、更新的关键字值和更新操作类型(insert、update或delete),ETL增量抽取进程首先根据源表名称和更新的关键字值,从源表中提取对应的完整记录,再根据更新操作类型,对目标表进行相应的处理。

性能好

覆盖场景全面

成本高,需要建触发器
全表对比(MD5) 为源头表建立一个结构类似的MD5临时表,每次抽数时对源头表和MD5临时表进行MD5校验码比对,从而决定源头表中的数据是新增、修改还是删除,同时更新MD5校验码。 所有场景
  1. 全表比对即在增量抽取时,ETL进程逐条比较源表和目标表的记录,将新增和修改的记录读取出来。
  2. 优化之后的全表比对方式是采用MD5校验码,需要事先为要抽取的表建立一个结构类似的MD5临时表,该临时表记录源表的主键值以及根据源表所有字段的数据计算出来的MD5校验码,每次进行数据抽取时,对源表和MD5临时表进行MD5校验码的比对,如有不同,进行update操作:如目标表没有存在该主键值,表示该记录还没有,则进行insert操作。然后,还需要对在源表中已不存在而目标表仍保留的主键值,执行delete操作。
覆盖场景全面 需要全表对比,性能差
全表对比(指定字段) 对比目标表和源头表的几个关键字段,获取源头表和目标表不一致的数据,然后增量写入到目标库。 所有场景
  1. 由用户来选择几个字段,可以作为唯一标识。
  2. 每次抽数时,对比一下源头表和目标表中这几个字段的差异,来判定表中数据是否存在增、删、改的情况。
  3. 将源头表变化的数据同步至目标表中。
覆盖场景全面 需要对比大量字段,性能差
分析日志 通过分析数据库自身的日志来判断变化的数据。 所有场景

该方式通过分析数据库自身的日志来判断变化的数据。关系型数据库系统都会将所有的DML操作存储在日志文件中,以实现数据库的备份和还原功能。ETL增量抽取进程通过对数据库的日志进行分析,提取对相关源表在特定时间后发生的DML操作信息,就可以得知自上次抽取时刻以来该表的数据变化情况,从而指导增量抽取动作。

有些数据库系统提供了访问日志的专用的程序包(例如Oracle的LogMiner),使数据库日志的分析工作得到大大简化。

性能好 数据库权限问题,未必能够提供日志分析权限

2、各种方式的差异排序

按同步性能由高到低排序依次为: 时间戳 > 日志解析 > 触发器 > 全表比对

按配置复杂由低到高排序依次为: 全表比对 <日志解析 < 触发器 < 时间戳

按易维护性由高到低排序依次为: 触发器 > 日志解析 > 时间戳 > 全表比对

按系统影响由低到高排序依次为:日志解析 < 时间戳 < 全表比对 < 触发器

备注:基于目前研究的结果,增量更新仅适用于明细数据的读写场景,不适用于包含单表计算、多表关联的场景,原因是获取的数据并不是全量数据。

参考:文章来源地址https://www.toymoban.com/news/detail-462441.html

  • ETL实现增量抽取的几种方式 - ligfoo - 博客园 (cnblogs.com)
  • 数据库增量数据的几种方式_shylhd的专栏-CSDN博客
  • 一般数据库增量数据处理和数据仓库增量数据处理的几种策略 - BIWORK - 博客园 (cnblogs.com)

到了这里,关于数仓知识07:数据增量更新的几种方式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 前端 mock 数据的几种方式

    目录 接口demo Better-mock just mock koa webpack Charles 总结         具体需求开发前,后端往往只提供接口文档,对于前端,最简单的方式就是把想要的数据写死在代码里进行开发,但这样的坏处就是和后端联调前还需要再把写死的数据从代码里删除,最好的方式是无侵入的  m

    2024年02月17日
    浏览(37)
  • form表单上传数据的几种方式

    form 的基本使用 1、什么是表单 表单在网页中主要负责 数据采集功能 。HTML中的标签,就是用于采集用户输入的信息,并通过标签的提交操作,把用户收集到的信息发送到 Web 服务器进行处理。 2、表单的组成部分 表单标签 就是我们常说的form表单,就是所谓的表单标签。 表单

    2024年02月08日
    浏览(31)
  • sql中删除数据的几种方式

    1、delete语句 Delete删除表数据,保留表结构,且可以加where,删除一行或多行。 只清除数据,保留表结构,列,权限,索引,视图,关系等等,相当于清零数据,是一种数据库定义语言(DDL Data Definition Language),执行后不能撤销。 清除数据并且销毁表,是一种数据库定义语言

    2024年02月11日
    浏览(34)
  • 35.MySQL导出数据的几种方式

    1.导出全表数据。 select * from test into outfile \\\'/tmp/a.sql\\\'; 2.导出某个数据库下的表。 --secure-file-priv=\\\'\\\'  mysqldump -T /data/backup -u root -prootroot --set-gtid-purged=OFF  test 将test数据库导出到:backup目录下。 3.导出自定义格式的文件。 mysql -uroot -prootroot -e \\\"select * from t2;\\\" test t2.sql  id    nam

    2024年02月04日
    浏览(34)
  • Django传递数据给前端的几种方式

    一、使用模板引擎:         Django的模板引擎允许在后端代码中将数据传递给前端模板,并在模板中进行渲染。在视图函数中,可以使用 render 函数来将数据传递给模板并渲染页面。例如: 在 my_template.html 模板中可以通过 {{ name }} 和 {{ age }} 来访问传递的数据。例如: 二

    2024年01月18日
    浏览(29)
  • js中追加数据到数组的几种方式

    在JavaScript中,有多种方式可以向数组中追加数据,包括: push()方法:将一个或多个元素添加到数组的末尾,并返回新数组的长度。 var arr = [1, 2, 3]; arr.push(4); console.log(arr); // [1, 2, 3, 4] unshift()方法:将一个或多个元素添加到数组的开头,并返回新数组的长度。 var arr = [2, 3, 4

    2024年02月15日
    浏览(35)
  • Unity笔记:数据持久化的几种方式

    主要方法: ScriptableObject PlayerPrefs JSON XML 数据库(如Sqlite) PlayerPrefs 存储的数据是 全局共享 的,它们存储在用户设备的本地存储中,并且可以被应用程序的所有部分访问。这意味着,无论在哪个场景、哪个脚本中,只要是同一个应用程序中的代码,都可以读取和修改 Playe

    2024年02月19日
    浏览(31)
  • Python爬虫数据存哪里|数据存储到文件的几种方式

    前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 爬虫请求解析后的数据,需要保存下来,才能进行下一步的处理,一般保存数据的方式有如下几种: 文件:txt、csv、excel、json等,保存数据量小。 关系型数据库:mysql、oracle等,保存数据量大。 非关系型数据库:Mongodb、R

    2024年02月09日
    浏览(31)
  • 【Python】导入Excel数据表的几种方式

    如何导入csv、xlsx格式的Excel; 一张数据表里有多个sheet页,如何获取所有sheet页名字,并导入每张sheet页; 1. 导入CSV格式的Excel表: 2. 导入xlsx格式的Excel表: 如果Excel表里只有一个sheet页: 如果Excel表里有多个sheet页: 如果Excel表里sheet页过多:

    2024年02月03日
    浏览(39)
  • Java提升数据库大数据查询速度的几种方式

    本文章以MySQL数据库为用例说明,列举出几个常用的提升查询速度的方式。 分页查询,在网络浏览中,经常会看到分页的使用,像百度搜索分页、文档资料分页等,这些都是一种常见的提升数据查询速度和用户体验的一种方式,数据库有limit,开发人员可使用此

    2024年02月12日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包