摘要:ETL是将业务系统的数据经过抽取、清洗转换之后加载到数据仓库的过程,是构建数据仓库的重要一环,用户从数据源抽取出所需的数据,经过数据清洗,最终按照预先定义好的数据仓库模型,将数据加载到数据仓库中。目的是将企业中的分散、零乱、标准不统一的数据整合到一起,为企业的决策提供分析依据。

1      ETL算法概览

算法应用场景概览

以上共计累积了8种ETL算法,其中主要分成4大类,增量累加、拉链算法是更符合数据仓库历史数据追踪的算法,但现实中基于业务及性能考虑,往往存在全删全插、增量累全算法的数据表应用。

2      全删全插模型

即Delete/Insert实现逻辑;

应用场景

主要应用在维表、参数表、主档表加载上,即适合源表是全量数据表,该数据表业务逻辑只需保存当前最新全量数据,不需跟踪过往历史信息。

算法实现逻辑

1.清空目标表;

2.源表全量插入;

>   ETL代码原型

--   1. 清理目标表
TRUNCATE TABLE <目标表>;--   2. 全量插入
INSERT INTO <目标表>   (字段***)
SELECT 字段***
FROM <源表>
***JOIN <关联数据>
WHERE   ***;

3      增量累全模型

即Upsert实现逻辑;

应用场景

主要应用在参数表、主档表加载上,即源表可以是增量或全量数据表,目标表始终最新最全记录。

算法实现逻辑

1.利用PK主键比对;

2.目标表和源表PK一致的变化记录,更新目标表;

3.源表存在但目标表不存在,直接插入;

ETL代码原型

-- 1. 生成加工源表
Create temp Table <临时表> ***;
INSERT INTO <临时表> (字段***)
SELECT 字段***
FROM <源表>
***JOIN <关联数据>
WHERE ***
;-- 2. 可利用Merge Into实现累全能力,当前也可以采用分步Delete/Insert或Update/Insert操作
Merge INTO <目标表> As T1 (字段***)
Using <临时表> as S1
on (***PK***)
when Matched then
update set Colx = S1.Colx ***
when Not Matched then
INSERT (字段***)   values (字段*** )
;

4      增量累加模型

即Append实现逻辑;

应用场景

主要应用在流水表加载上,即每日产生的流水、事件数据,追加到目标表中保留全历史数据。流水表、快照表、统计分析表等均是通过该逻辑实现。

算法实现逻辑

1.源表直接插入目标表;

>  ETL代码原型

--   1.插入目标表
INSERT INTO <目标表>   (字段***)
SELECT 字段***
FROM <源表>
***JOIN <关联数据>
WHERE   ***;

5      全历史拉链模型

拉链表背景知识

概念

拉链表是一张至少存在PK字段、跟踪变化的字段、开链日期、闭链日期组成的数据仓库ETL数据表;

益处

根据开链、闭链日期可以快速提取对应日期有效数据;

对于跟踪源系统非事件流水类表数据,拉链算法发挥越大作用,源业务系统通常每日变化数据有限,通过拉链加工可以大大降低每日打快照带来的空间开销,且不损失数据变化历史;

示例,提取指定日期有效数据

提取2020年2月5日当日有效数据

Select *
From  <目标表>
Where 开始日期<=date'2020-02-05'
And   结束日期 >date'2020-02-05';

最终提取到数据:

应用场景

全历史拉链,跟踪源表全量变化历史,若源表记录不存在,则说明数据闭链;根据PK新拉一条有效记录。

算法实现逻辑

1.提取当前有效记录;

2.提取当日源系统最新数据;

3.根据PK字段比对当前有效记录与最新源表,更新目标表当前有效记录,进行闭链操作;

4.根据全字段比对最新源表与当前有效记录,插入目标表;

>  ETL代码原型

-- 1. 提取当前有效记录
Insert into <临时表-开链-pre> (不含开闭链字段***)
Select 不含开闭链字段***
From <目标表>
Where 结束日期 =date'<最大日期>';
;
-- 2. 提取当日源系统最新数据
<源表临时表-cur>
-- 3 今天全部开链的数据,即包含今天全新插入、数据发生变化的记录
Insert Into <临时表-增量-ins>
Select 不含开闭链字段***
From <源表临时表-cur>
where (不含开闭链字段***) not in(Select 不含开闭链字段***From <临时表-开链-pre>);
-- 4 今天需要闭链的数据,即今天发生变化的记录
Insert into <临时表-增量-upd>
Select 不含开闭链字段***,开始时间
From <临时表-开链-pre>
where (不含开闭链字段***) not in(Select 不含开闭链字段***From <临时表-开链-cur>);
-- 5 更新闭链数据,即历史记录闭链(删除-插入替代更新)
DELETE FROM <目标表>
WHERE (PK***) IN
(Select PK*** From <临时表-增量-upd>)
AND 结束日期=date'<最大日期>';
INSERT INTO <目标表>(不含开闭链字段***,开始时间,结束日期)
Select 不含开闭链字段***,开始时间,date'<数据日期>'
From  <临时表-增量-upd>;
-- 6 插入开链数据,即当日新增记录
INSERT INTO <目标表> .(不含开闭链字段***,开始时间,结束日期)
Select 不含开闭链字段***,date'<数据日期>',date'<最大日期>'
From    <临时表-增量-ins>;

6      增量拉链模型

应用场景

增量拉链,目的是追踪数据增量变化历史,根据PK比对新拉一条开链数据;

算法实现逻辑

1.提取上日开链数据;

2.PK相同变化记录,关闭旧记录链,开启新记录链;

3.PK不同,源表存在,新增开链记录

>  ETL代码原型

--   1. 提取当前有效记录
Insert into <临时表-开链-pre> (不含开闭链字段***)
Select 不含开闭链字段***
From <目标表>
Where 结束日期 =date'<最大日期>';
--   2. 提取当日源系统增量记录
<源表临时表-cur>
--   3. 提取当日源系统新增记录
Insert into <临时表-增量-ins>
Select 不含开闭链字段***
From <临时表-开链-cur>
where (***PK***) not in(select ***PK*** from <临时表-开链-pre>);
--   4. 提取当日源系统历史变化记录
Insert into <临时表-增量-upd>
Select 不含开闭链字段***
From <临时表-开链-cur>
inner join <临时表-开链-pre>
on (***PK 等值***)
where (***变化字段 非等值***);
--   5. 更新历史变化记录,关闭历史旧链,开启新链
update <目标表> AS T1
SET <***变化字段 S1赋值***>,结束日期 = date'<数据日期>'
FROM <临时表-增量-upd> AS S1
WHERE ( <***PK 等值***> )
AND   T1.结束日期 =date'<最大日期>'
;
INSERT INTO <目标表>(不含开闭链字段***,开始时间,结束日期)
SELECT 不含开闭链字段***,date'<数据日期>',date'<最大日期>'
FROM <临时表-增量-upd>;
--   6. 插入全新开链数据
INSERT INTO <目标表>(不含开闭链字段***,开始时间,结束日期)
SELECT 不含开闭链字段***,date'<数据日期>',date'<最大日期>'
FROM <临时表-增量-ins>;

7      增删拉链模型

应用场景

主要是利用业务字段跟踪增量数据中包含删除的变化历史。

算法实现逻辑

1.提取上日开链数据;

2.提取源表非删除记录;

3.PK相同变化记录,关闭旧记录链,开启新记录链;

4.PK比对,源表存在,新增开链记录;

5.提取源表删除记录;

6.PK比对,旧开链记录存在,关闭旧记录链;

>  ETL代码原型

--   1. 清理目标表《待续...》TRUNCATE TABLE <目标表>;--   2. 全量插入INSERT INTO <目标表>   (字段***)SELECT 字段***FROM <源表>***JOIN <关联数据>WHERE   ***;

8      全量增删拉链模型

应用场景

主要是利用业务字段跟踪全量数据中包含删除的变化历史。

算法实现逻辑

1.提取上日开链数据;

2.提取源表非删除记录;

3.PK相同变化记录,关闭旧记录链,开启新记录链;

4.PK比对,源表存在,新增开链记录;

5.提取源表删除记录;

6.PK比对,旧开链记录存在,关闭旧记录链;

7.PK比对,提取旧开链存在但源表不存在记录,关闭旧记录链;

>  ETL代码原型

--   1. 清理目标表,《待续...》
TRUNCATE TABLE <目标表>;--   2. 全量插入
INSERT INTO <目标表>   (字段***)
SELECT 字段***
FROM <源表>
***JOIN <关联数据>
WHERE   ***;

9      自拉链模型

>  应用场景

主要将流水表数据转化成拉链表数据。

>  算法实现逻辑

借助源表业务日期字段,和目标表开链、闭链日期比对,首尾相接,拉出全历史拉链;

>  ETL代码原型

--   1. 清理目标表,《待续...》
TRUNCATE TABLE <目标表>;--   2. 全量插入
INSERT INTO <目标表>   (字段***)
SELECT 字段***
FROM <源表>
***JOIN <关联数据>
WHERE   ***;

10  其它说明

1.根据数据仓库最佳实践,所有数据表通常还会包含一些控制字段,即插入日期、更新日期、更新源头字段,这样对于数据变化敏感的数据仓库,可以进一步追踪数据变化历史;

2.ETL算法本身是为了更好服务于数据加工过程,实际业务实现过程中,并不局限于传统算法,即涉及到更多适应业务的自定义的ETL算法。

点击这里→了解更多精彩内容

相关推荐

灰度图二值化算法

深度理解AI概念、算法及如何进行AI项目开发

多模态融合算法——Multimodal Compact Bilinear Pooling

【华为云技术分享】8种ETL算法汇总大全!看完你就全明白了相关推荐

  1. 【华为云技术分享】打卡APIG服务专享版,打造全栈API治理方案

    伴随企业的数字化转型跟IT架构演进,越来越多的企业&组织选择以API的方式实现能力的开放跟通讯,这部分也成了系统集成的交界点.通过三组数据来看整体趋势 2017年,有50%的B2B商业合作将通 ...

  2. 【华为云技术分享】云图说 | 一张图看懂华为云弹性公网IP

    弹性公网IP(Elastic IP)提供独立的公网IP资源,包括公网IP地址与公网出口带宽服务.可以与弹性云服务器.裸金属服务器.虚拟IP.弹性负载均衡.NAT网关等资源灵活地绑定及解绑.拥有多种灵活 ...

  3. 【华为云技术分享】【Python算法】分类与预测——Python随机森林

    1.随机森林定义 随机森林是一种多功能的机器学习算法,能够执行回归和分类的任务.同时,它也是一种数据降维手段,在处理缺失值.异常值以及其他数据探索等方面,取得了不错的成效.另外,它还担任了集成学习中的 ...

  4. 【华为云技术分享】【Python算法】分类与预测——支持向量机

    1.支持向量机定义 在机器学习领域,支持向量机 SVM(Support Vector Machine)是一个有监督的学习模型,通常用来进行模式识别.分类.以及回归分析.给出一个简单的线性分类问题,要用 ...

  5. 【华为云技术分享】【Python算法】分类与预测——决策树

    1.决策树定义 决策树方法在分类.预测.规则提取等领域有着广泛的应用.20 世纪 70 年代后期和 80 年代初期,机器学习研究者 J.Ross Quinlan 提出了 ID3 算法以后,决策树就在机 ...

  6. 【华为云技术分享】人脸识别算法的训练之路(下)

    人脸识别算法的训练之路(上) 人脸识别 人脸识别问题本质是一个分类问题,即每一个人作为一类进行分类检测,但实际应用过程中会出现很多问题.第一,人脸类别很多,如果要识别一个城镇的所有人,那么分类类别就将 ...

  7. 【华为云技术分享】敏捷DevOps知识卡大全(内附下载资料)

    如果您曾经对敏捷或DevOps的结构.知识有过疑问,那么您将在[敏捷智库]里找到答案,本文将为大家带来用户故事拆分.DevOps转型闭坑指南的精彩内容. 知识卡每周持续更新,请收藏关注~ 如果您想在知 ...

  8. 【华为云技术分享】“技术-经济范式”视角下的开源软件演进剖析-part 1

    前言 以互联网为代表的信息技术的迅猛发展对整个经济体系产生了巨大的影响.信息技术的发展一方面使知识的积累和传播更加迅速,知识爆炸性的增长:另一方面,使信息的获取变得越来越容易,信息交流的强度逐渐增加, ...

  9. 【华为云技术分享】“技术-经济范式”视角下的开源软件演进剖析-part 3

    4. 微观层面 4.1 个体动机 在开源软件发展之初, 商业组织的投入很少甚至没有, 完全是靠Richard Stallman 或者 linus Torvalds 这样的个人在努力推动开源软件艰难前行 ...

最新文章

  1. PXE网络无人职守安装
  2. JavaScript中的正则表达式解析
  3. 组合计数 ---- 2020 EC final B. Rectangle Flip 2(枚举+组合计数)
  4. [MetalKit]34-Working-with-memory-in-Metal内存管理
  5. java setpaintmode 用法_详解Paint的各种set方法
  6. 组件:slot插槽、组件:组合slot
  7. CSS3质感分析——表面线性渐变
  8. easyui crud java_Easyui 创建 CRUD 应用_EasyUI 插件
  9. libcurl post数据
  10. 弹性地基梁板实用计算_建筑地基基础设计规范要点
  11. 【愣锤笔记】能解决80%场景的Git必会知识点
  12. bugku 社工-初步收集
  13. 通信工程专业高级工程师职称申报经验分享
  14. 空间数据格式转换之MapInfo mid/mif文件转ArcGIS shpfile文件
  15. 图论学习笔记——可达矩阵
  16. 盘点丨12款数据库建模工具特点,总有一款适合你!
  17. Linux之shell脚本编程、多命令、脚本、bc计算器、反引号、if语句、for语句
  18. PHP 第三方调用 UC_Center用户登录认证
  19. 装饰者模式 增加功能;动态代理减少功能 只要完成自己部分功能 (繁杂部分交给他人处理)...
  20. PDF Expert教程之批注功能详解

热门文章

  1. 深度学习笔记(34) 目标检测
  2. 深度学习笔记(18) 迁移学习
  3. php 返回object,深入分析使用mysql_fetch_object()以对象的形式返回查询结果
  4. 手机端html返回顶部,vue实现移动端返回顶部
  5. chroma负载机恒压工作原理_双轴撕碎机结构有哪些部分组成?双轴撕碎机工作原理...
  6. Spring Security(四) —— 核心过滤器源码分析
  7. Ionic4.x 中自定义公共模块
  8. 步步为营-75-Cookie简介
  9. getHibernateTemplate()的find用法大全
  10. (十一)Hibernate 高级配置