关于数据增量抽取的模拟实现——原理

简介:
ETL是数据仓库的一个重要处理环节, Extract即是从业务数据库中抽取数据 ,Transform即是根据业务逻辑规则对数据进行加工的过程, Load即是把数据加载到数据仓库的过程。
通常为了尽可能的减少对业务系统的压力和性能影响,或者因为网络传输异构数据库等原因,一般都是根据特定的增量抽取原则,将数据从业务数据库导出到 flat文本文件或者 XML文件中,也叫数据缓存区或者数据登台区(这名字起得特别别扭)。本文讨论的是从业务数据库直接抽取到数据仓库。数据仓库是一种体系架构,而不是一种纯粹的技术。实际上,大多数数据库都提供了类似的不同数据库直接连接的接口,例如 SQLServer的链接数据库, Oracle的透明网关等等。
关于数据的增量抽取也是一个重要的讨论话题,其原因主要是在超大数据量情况下任何关系数据库都无法满足数据处理的要求。在《数据仓库》 (Inmon)一书中,主要描述了以下 3种方法:
1、 数据增量抽取,主要是基于时间戳的
2、 扫描增量文件,实际上就是关系数据库的归档日志。
3、 前后映像对比
当然每种方法都有其优势和劣势,本文旨在讨论基于时间戳的数据增量抽取的实现,无意探讨和比较这三种方法的优劣。
当然在进行基于时间戳的数据增量处理之前,首先要满足以下假设。
1、 假设在业务数据库中存在着一个特定的时间属性,作为增量抽取的唯一标识。
2、 假设在这个字段上存在着索引字段。这样我们的数据增量抽取模拟脚本就不会遭遇到性能瓶颈。当然我们还会通过将大事务尽可能变成小事务的原则进行优化。
3、 假设业务数据库和数据仓库能够以某种方式直接连接。
4、 抽取过程中,尽量避免数据转换、清洗的动作,以减少对业务数据库的性能影响。
在满足了以上条件之后,我们才能进一步考虑数据增量抽取脚本的实现。
 
 
下面开始对基于时间戳的数据增量抽取进行系统设计:
1、 建立链接数据库。
2、 首先需要定义一张数据字典表,定义需要进行处理的任务,其中主要包括业务数据库和目标数据库的表名、字段列表、以及 where条件等。
序号 
 字段名称 
 字段描述 
 字段类型 
 备注 
 

 TaskName 
 任务名称 
 Varchar(32) 
 
 

 TargetTable 
 数据仓库目标表名称 
 Varchar(32) 
 
 

 TargetFieldList 
 数据仓库字段列表 
 Varchar(500) 
 
 

 SourceTable 
 业务数据库表名称 
 Varchar(32) 
 
 

 SourceFieldList 
 业务数据库字段列表 
 Varchar(500) 
 
 

 WhereFieldName 
 增量抽取字段名称 
 Varchar(32) 
 
 

 IncType 
 增量抽取的粒度 
 Int 
 1、小时; 2、日 
 

 TransType 
 控制事务处理大小的粒度 
 Int 
 1、小时; 2、日 
 

 TargetDate 
 数据仓库最大时间 
 Datetime 
 
 
10 
 SourceDate 
 业务数据库最大时间 
 Datetime 
 截取到整点 
 
11 
 Flag 
 处理标志 
 Int 
 1成功, 2失败 
 
12 
 Note 
 备注 
 Varchar(500) 
 

3、 有了这张字典表就可以开始进行工作了,为了方便表达,暂时处理成伪代码形式,同时只以一个表的处理为例。
1、获取数据仓库目标表目前的最大时间(读取字典表或者当前表均可)
2、获取业务数据库业务表目前的最大时间(需要到业务系统中去读取)
3、如果业务数据库业务表数据为空,退出执行
4、如果数据仓库为空,业务数据库不为空,则再次读取业务数据库最小时时间
5、如果均不为空,则设置开始抽取最小时间和最大时间
6、最大时间设置为整点
7、根据控制事务处理大小的粒度,进行循环抽取
8、拼写 SQL语句,写成类似以下的形式
INSERT INTO TargetTable (TargetFieldList)
SELECT SourceFieldList FROM SourceTable
WHERE WhereFieldName> BeginDate
AND WhereFieldName< BeginDate+粒度
9、处理状态写入该字典表 

1、获取数据仓库目标表目前的最大时间(读取字典表或者当前表均可)
2、获取业务数据库业务表目前的最大时间(需要到业务系统中去读取)
3、如果业务数据库业务表数据为空,退出执行
4、如果数据仓库为空,业务数据库不为空,则再次读取业务数据库最小时时间
5、如果均不为空,则设置开始抽取最小时间和最大时间
6、最大时间设置为整点
7、根据控制事务处理大小的粒度,进行循环抽取
8、拼写 SQL语句,写成类似以下的形式
INSERT INTO TargetTable (TargetFieldList)
SELECT SourceFieldList FROM SourceTable
WHERE WhereFieldName> BeginDate
AND WhereFieldName< BeginDate+粒度
9、处理状态写入该字典表 
 
4、 有一点要主要的是,在 SQLServer中有两种使用链接数据库的方法:
OPENQUERY ( linked_server , 'query' )
linked_server_name.catalog.schema.object_name 的四部分名称
这两种方法各有利弊,第二种容易阅读一些;第一种方法据说把语句提交到源数据库执行的,效率可能会高些(实际的资料并未找到)。
其次这两种方法在使用起来语法有点差别,第一种方法采用的是宿主数据库的语法形式,第二种方法采用的是 SQLServer本身的语法形式。因此在写脚本的时候也会有所不同。主要差别是在字段列表和条件处,暂时采用第一种方式。





本文转自baoqiangwang51CTO博客,原文链接:http://blog.51cto.com/baoqiangwang/309786 ,如需转载请自行联系原作者
相关文章
|
8月前
|
机器学习/深度学习 数据可视化 网络架构
PINN训练新思路:把初始条件和边界约束嵌入网络架构,解决多目标优化难题
PINNs训练难因多目标优化易失衡。通过设计硬约束网络架构,将初始与边界条件内嵌于模型输出,可自动满足约束,仅需优化方程残差,简化训练过程,提升稳定性与精度,适用于气候、生物医学等高要求仿真场景。
934 4
PINN训练新思路:把初始条件和边界约束嵌入网络架构,解决多目标优化难题
|
10月前
|
机器学习/深度学习 人工智能 自然语言处理
MCP、LLM与Agent:企业AI实施的新基建设计方案
MCP+LLM+Agent架构通过"大脑-神经网络-手脚"的协同机制,实现从数据贯通到自主执行的智能闭环。本文将深度解析该架构如何将产线排查效率提升5倍、让LLM专业术语识别准确率提升26%,并提供从技术选型到分层落地的实战指南,助力企业打造真正融入业务流的"数字员工"。通过协议标准化、动态规划与自愈执行的三重突破,推动AI从演示场景迈向核心业务深水区。
|
JSON 算法 Java
hutool工具的简单使用
这篇文章介绍了Hutool工具库的基本使用,通过代码示例展示了如何利用Hutool进行字符串处理、文件操作、集合操作、加密解密、日期时间处理、网络请求和读取资源文件等常见任务。
735 0
hutool工具的简单使用
|
API
全国行政区划查询免费API接口教程
该接口提供全国(不含港澳台)各级行政区划查询服务,适用于地址填写、资料登记等场景。支持5级划分:省、市、区县、乡镇、村。请求需提供用户ID、KEY及查询级别等参数,返回地名列表或错误信息。 示例中ID和KEY为公共测试用,建议使用个人ID和KEY以享受更高调用频率。
3978 23
|
jenkins 持续交付
Jenkins(2)- 更改插件源为国内源
Jenkins(2)- 更改插件源为国内源
1858 0
Jenkins(2)- 更改插件源为国内源
|
存储 编解码 算法
MoviePy,一个超强的Python库
MoviePy,一个超强的Python库
1411 1
|
存储 测试技术 C语言
【数据结构】—C语言实现单链表(超详细!)
【数据结构】—C语言实现单链表(超详细!)
|
安全 测试技术 虚拟化
Docker实战案例研究:深入行业应用与最佳实践
Docker作为一种轻量级、可移植、可扩展的容器化技术,在各行各业都得到了广泛应用。本文将通过深入实际案例,介绍Docker在不同行业的应用以及相应的最佳实践,提供更加丰富的示例代码,以帮助大家更全面地理解和运用Docker的强大功能。
|
C# 图形学
【Unity 3D】元宇宙案例之虚拟地球信息射线实战(附源码、演示视频和步骤 超详细)
【Unity 3D】元宇宙案例之虚拟地球信息射线实战(附源码、演示视频和步骤 超详细)
699 0
|
缓存 安全 NoSQL
SpringSecurity实现前后端分离登录token认证详解
SpringSecurity实现前后端分离登录token认证详解
1200 1