文档章节

不同数据源特征及对应的增量数据捕获策略(转)

小强斋太
 小强斋太
发布于 2016/11/09 20:07
字数 1802
阅读 1
收藏 0
点赞 0
评论 0

CDC的引入

通常在数据量较少的情况下,我们从一个数据源将全部数据加载到目标数据库的时候可以采取的策略可以是:先将目标数据库的数据全部清空掉,然后全部重新从数据源加载进来。这是一个最简单并且最直观的并且不容易出错的一种解决方案,但是在很多时候会带来性能上的问题。

如果我们的数据源来自于不同的业务系统,数据动辄百万,千万甚至亿级计算。第一次需要全部加载,如果在第二次周期或者第三次周期的时候仍然全部加载的话,耗费了极大的物理和时间资源。有可能部分数据源并未发生变化,而有的数据源可能只是增加了少量的数据。

我们要考虑的问题是,对于已经存在目标数据库中的数据都是历史数据,对于数据源中的数据我们只应该考虑新修改的记录和新插入的记录,只应该考虑这两种数据。所以增量处理实质上就是处理变化的数据。

不同数据源特征及对应的处理方式

增量加载的处理策略不是一成不变的,采取哪一种加载策略跟数据源的设计有很大的关系。良好的数据源设计可能直接就给后续的增量处理提供了最直接的判断依据,比如自增长列,时间日期戳等。还有的数据源设计可能加入了触发器,在数据新增,修改或者删除的过程中就做出了有效的日志记录。或者加入了一些审核表,在数据的增删改过程中记录并跟踪了数据的操作细节。

下面我们一起看看针对不同数据源设计,如何实现增量数据的检测和抽取。

第一类 - 具有时间戳或者自增长列的绝对历史数据表

clip_image001

这张表能够代表一部分数据源的特征 - 绝对历史事实数据。它指的是表中的数据是不可逆的,只有插入操作没有删除或者修改操作,表示在过去一段时间内完成的事实业务数据。比如这张表表示的某些产品的下载信息,用户什么时候下载了产品就会在数据库中记录一条数据。

这种数据表一般会提供一列能够记载这条记录生成的历史时间,或者说这个操作发生的时间,越早的操作时间越靠前,越晚的操作时间越靠后。

那么对于这类表的增量处理策略就是:

  1. 第一次加载动作完成之后,记录一下最大的时间点,保存到一个加载记录表中。
  2. 从第二次加载开始先比较上次操作保存的最后/最大的时间点,只加载这个时间点以后的数据。
  3. 当加载过程全部成功完成之后再更新加载记录表,更新这次最后的时间点。

另外,如果这类表有自增长列的话,那么也可以使用自增长列来实现这个标识特征。

第二类 - 有修改时间特征的数据表

clip_image002

这类表中的数据一般属于可以修改带有维护性质的数据,比如像会员信息表,创建会员的时候会生成一条记录,会在 CreateDate 标记一下,并且在 UpdateDate 中保存的也是 CreateDate 的值。当 CreateDate 和 UpdateDate 相同的时候说明这一条数据是插入操作,但是这个会员的信息是可以被编辑和修改的,于是每次更新的同时也更新了 UpdateDate 时间戳。

假设上面的这几条数据在第一次加载到目标数据库后,源表新加入了一条会员记录并同时修改了一条会员的信息。

clip_image003

那么像这种情况下增量数据处理的策略就可以是:

  1. 第一次加载动作完成以后,记录一下最大的 UpdateDate 时间戳,保存到一个加载记录表中。(第一次是 2010-10-23)
  2. 在第二次加载数据的时候,用加载记录表中的时间戳与源表里的 UpdateDate 相比较,比时间戳大的说明是新添加的或者修改的数据。(大于 2010-10-23 的是第一条 Update 的数据和第四条新增的数据)
  3. 当整个加载过程成功之后,更新最大的 UpdateDate到记录表中。(记录表中将 2010-10-26 记录下来)

但是要注意的是,不是每一个带有修改时间特征的数据表都会这么设计,有可能在插入数据的时候只会放入 CreateDate 但是并不会写入 UpdateDate。这样的话,在每次加载的过程中可能就需要同时比较 CreateDate 和 UpdateDate 了。

第三类 - 关联编辑信息的无时间特征数据表

clip_image004

这类表本身没有任何可以标识的自增长 ID 或者时间戳,只保留基本信息,所有的编辑操作等信息专门有一张表来记录。这样的设计可以是为了单独记载所有的编辑历史信息,但是同时又保留了主要信息的独立性,在查询主表的时候查询体积变小提供查询效率。类似于这样的设计可以参照第一类和第二类的设计方案,在这个示例中多出的就是要关联 Member Audit History 表并进行时间戳或者自增长ID 的判断。

那么对于前三类数据表,它们可以共同使用一个加载记录表来记录它们上一次的时间戳或者自增 ID。

clip_image005

对于 Table A -

SELECT 列1, 列2
FROM Table_A
WHERE ID > (SELECT LastSeqID FROM SourceLoadingAudit WHERE SourceTable = 'Table_A ')

对于 Table C -

SELECT 列1, 列2
FROM Table_C
WHERE UpdateDate > (SELECT LastModifiedDate FROM SourceLoadingAudit WHERE SourceTable = 'Table_C')

第四类 - 无特征数据表

clip_image006

基于唯一列的数据对比。

很简单的概念 - 即每次加载数据源中的数据时,基于主键或者唯一列到目标表中查询是否存在,如果不存在就插入。如果存在就比较关键列数据是否相等,不相等就修改。

总结

增量数据加载的策略与数据源有莫大的关系,也与实际需求有莫大关系,因此在设计增量数据加载的过程中需要围绕实际需求以及数据源能够提供的增量变化特征仔细思考,甚至反复测试来达到加载机制的稳定和可靠性。

原文:

一般数据库增量数据处理和数据仓库增量数据处理的几种策略

本文转载自:http://www.cnblogs.com/xqzt/p/4484197.html

共有 人打赏支持
小强斋太
粉丝 0
博文 181
码字总数 0
作品 0
广州
ETL加载策略

ETL 数据加载机制概述 ETL 是数据抽取(Extract)、转换(Transform)、加载(Load)的简写,它的功能是从数据源抽取出所需的数据,经过数据清洗和转换,最终按照预先定义好的数据仓库模型,...

张欢19933 ⋅ 2016/09/12 ⋅ 0

ETL之增量抽取方式

1、触发器方式触发器方式是普遍采取的一种增量抽取机制。该方式是根据抽取要求,在要被抽取的源表上建立插入、修改、删除3个触发器,每当源表中的数据发生变化,就被相应的触发器将变化的数据...

开源中国技术顾问 ⋅ 2016/07/01 ⋅ 0

ETL增量抽取方法讲解

一、.ETL体系结构 数据库--->抽取---> 转换--->加载--->目的数据源 二、ETL抽取方案 1).全量抽取 全量抽取类似于数据迁移或数据复制,它将数据源中的表或视图的数据原封不动的从数据库中抽取...

wdvceafvcsrgfv的博客 ⋅ 2017/12/12 ⋅ 0

HAWQ取代传统数仓实践(三)——初始ETL(Sqoop、HAWQ)

一、用sqoop用户建立初始抽取脚本 本示例要用Sqoop将MySQL的数据抽取到HDFS上的指定目录,然后利用HAWQ外部表功能将HDFS数据文件装载到内部表中。表1汇总了示例中维度表和事实表用到的源数据...

wzy0623 ⋅ 2017/05/12 ⋅ 0

HAWQ取代传统数仓实践(四)——定期ETL(Sqoop、HAWQ)

一、变化数据捕获(CDC) 初始装载只在数据仓库开始使用前执行一次,然而,必须要周期性地执行装载源数据过程。与初始装载不同,定期装载一般都是增量的,并且需要捕获并且记录数据的变化历史...

wzy0623 ⋅ 2017/05/12 ⋅ 0

备份MySQL数据库的4种方式

备份MySQL数据库的4种方式 前言 我们试着想一想, 在生产环境中什么最重要?如果我们服务器的硬件坏了可以维修或者换新, 软件问题可以修复或重新安装, 但是如果数据没了呢?这可能是最恐怖的事...

xiaocao13140 ⋅ 05/29 ⋅ 0

基于Hadoop生态圈的数据仓库实践 —— ETL(一)

一、使用Sqoop抽取数据 1. Sqoop简介 Sqoop是一个在Hadoop与结构化数据存储(如关系数据库)之间高效传输大批量数据的工具。它在2012年3月被成功孵化,现在已是Apache的顶级项目。Sqoop有Sqo...

wzy0623 ⋅ 2016/07/01 ⋅ 0

深入了解当前ETL中用到的一些基本技术

【赛迪网-IT技术报道】前言: 数据集成是把不同来源、格式和特点的数据在逻辑上或物理上有机地集中,从而为企业提供全面的数据共享,是企业商务智能、数据仓库系统的重要组成部分。ETL是企业...

dwf07223 ⋅ 2014/09/17 ⋅ 0

InfoSphere CDC 企业传统数据到大数据集成的加速器

我们常常会思考什么样的数据才是大数据,只有数据量大才能真正称之为大数据吗?其实不然,大数据的特征应该包括数量、速度,多样性和精准性这四个方面,也就是通常所说的4个V: Volume,Velocity,...

勿忘初心321 ⋅ 2016/12/08 ⋅ 0

深入了解当前ETL中用到的一些基本技术

数据集成是把不同来源、格式和特点的数据在逻辑上或物理上有机地集中,从而为企业提供全面的数据共享,是企业商务智能、数据仓库系统的重要组成部分。ETL是企业数据集成的饕饩龇桨浮N恼麓覧...

bsbforever ⋅ 2015/01/12 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Spring | IOC AOP 注解 简单使用

写在前面的话 很久没更新笔记了,有人会抱怨:小冯啊,你是不是在偷懒啊,没有学习了。老哥,真的冤枉:我觉得我自己很菜,还在努力学习呢,正在学习Vue.js做管理系统呢。即便这样,我还是不...

Wenyi_Feng ⋅ 今天 ⋅ 0

博客迁移到 https://www.jianshu.com/u/aa501451a235

博客迁移到 https://www.jianshu.com/u/aa501451a235 本博客不再更新

为为02 ⋅ 今天 ⋅ 0

win10怎么彻底关闭自动更新

win10自带的更新每天都很多,每一次下载都要占用大量网络,而且安装要等得时间也蛮久的。 工具/原料 Win10 方法/步骤 单击左下角开始菜单点击设置图标进入设置界面 在设置窗口中输入“服务”...

阿K1225 ⋅ 今天 ⋅ 0

Elasticsearch 6.3.0 SQL功能使用案例分享

The best elasticsearch highlevel java rest api-----bboss Elasticsearch 6.3.0 官方新推出的SQL检索插件非常不错,本文一个实际案例来介绍其使用方法。 1.代码中的sql检索 @Testpu...

bboss ⋅ 今天 ⋅ 0

informix数据库在linux中的安装以及用java/c/c++访问

一、安装前准备 安装JDK(略) 到IBM官网上下载informix软件:iif.12.10.FC9DE.linux-x86_64.tar放在某个大家都可以访问的目录比如:/mypkg,并解压到该目录下。 我也放到了百度云和天翼云上...

wangxuwei ⋅ 今天 ⋅ 0

PHP语言系统ZBLOG或许无法重现月光博客的闪耀历史[图]

最近在写博客,希望通过自己努力打造一个优秀的教育类主题博客,名动江湖,但是问题来了,现在写博客还有前途吗?面对强大的自媒体站点围剿,还有信心和可能型吗? 至于程序部分,我选择了P...

原创小博客 ⋅ 今天 ⋅ 0

IntelliJ IDEA 2018.1新特性

工欲善其事必先利其器,如果有一款IDE可以让你更高效地专注于开发以及源码阅读,为什么不试一试? 本文转载自:netty技术内幕 3月27日,jetbrains正式发布期待已久的IntelliJ IDEA 2018.1,再...

Romane ⋅ 今天 ⋅ 0

浅谈设计模式之工厂模式

工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 在工厂模式中,我们在创建对象时不会对客户端暴露创建逻...

佛系程序猿灬 ⋅ 今天 ⋅ 0

Dockerfile基础命令总结

FROM 指定使用的基础base image FROM scratch # 制作base image ,不使用任何基础imageFROM centos # 使用base imageFROM ubuntu:14.04 尽量使用官方的base image,为了安全 LABEL 描述作...

ExtreU ⋅ 昨天 ⋅ 0

存储,对比私有云和公有云的不同

导读 说起公共存储,很难不与后网络公司时代的选择性外包联系起来,但尽管如此,它还是具备着简单和固有的可用性。公共存储的名字听起来也缺乏专有性,很像是把东西直接堆放在那里而不会得到...

问题终结者 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部