浅谈ETL架构中ODS的作用以及如何在HaoheDI中自动创建ODS表
什么是ODS表?
在ETL架构中,源数据很少会直接抽取加载到数据仓库EDW,二者之间往往会设置一个源数据的临时存储区域,存储数据在清洗转换前的原始形态,通常被大家称做操作型数据存储,简称ODS,在Kimball维度建模理论中,将其称之为Staging Area(意为部队从一个战场转往另一个战场的集结地),翻译过来称之为数据登台区,如图所示:

上图摘自Ralph Kimball的《数据仓库生命周期工具箱》
为什么需要ODS?
ODS在整个数据中心体系架构中的具有非常重要的作用,体现在以下几点:
- 统一源数据的数据格式,降低数据清洗转换的复杂性
一般的数据仓库应用系统都具有非常复杂的数据来源,这些数据存放在不同的地理位置、不同的数据库、不同的应用之中,从这些业务系统对数据进行抽取并不是一件容易的事,比如有时源和目标不能直接连通,数据可能会用文件方式上传上来,这就需要将原始数据先落地到ODS中。因此,ODS用于存放从业务系统直接抽取出来的数据,这些数据从数据结构、数据之间的逻辑关系上都与业务系统基本保持一致,因此在抽取过程中极大降低了数据转化的复杂性,而主要关注数据抽取的接口、数据量大小、抽取方式等方面的问题。各种原始数据以统一的格式存放在一个数据库中,更加便于后续的数据清洗与转换。
- 保留原始数据当时时点的快照,便于数据转换后的校验排错和批次重跑
业务系统中的数据是会发生增删改变化的,尤其是像客户、产品、机构这样的维度数据,其状态和属性都会随着时间不断改变,而数据仓库是需要记录并分析其历史状态的,如缓慢变化维(拉链表)和快照型事实表,在得到最终的统计分析结果之前,数据会经过一层一层的转换加工,期间会有大量的计算和处理逻辑,在ETL开发和运维过程中,经常会发现某些公式或处理逻辑有误,修改之后不得不重跑之前一系列的批次数据,如果之前没有保留这些时点上的原始数据,则很多数据重跑将变得不可能,因为源系统中的部分数据已经发生了变化,另外将数据快照下来也便于和前端统计查询结果进行校验核对,以便找出出错原因。
- 转移一部分业务系统细节查询的功能,并可以支持实时数据的查询统计
在数据仓库建立之前,大量的报表、分析是由业务系统直接支持的,在一些比较复杂的报表生成过程中,对业务系统的运行产生相当大的压力。ODS的数据从粒度、 组织方式等各个方面都保持了与业务系统的一致,那么原来由业务系统产生的报表、细节数据的查询自然能够从ODS中进行,从而降低业务系统的查询压力。另外由于从源数据到最终的分析结果,需要经历较长时间的ETL转换,所以一些对实时性要求比较高的查询分析是可以直接从ODS中取数的,比如风控预警和实时仪表盘。
ODS表长什么样?
ODS通常采用数据库进行存储,只存储对数据分析有价值的源数据,数据结构通常和源非常相似,在源表结构基础上会扩充字段以表示数据来源、数据日期、导入时间等审计信息。一个ODS表的例子:

这个表存储每天按时间戳增量抽取的血糖检测记录,名称用O_前缀进行标识。红色区域的字段基本上和源表结构保持一致,也可以只存后期数仓中需要的字段,去掉一些没有必要的字段,另外一些字段类型也可以做简单的改变,但要确保可以记录原始数据的原貌。开头的两个字段是ODS表新增的审计字段,其中ETLBATCHID表示数据的批次号,用于表示是哪个时期(点)的数据,如果数据每天一个批次的话,这里将会存一个数字型日期如20190301(YYYYMMDD),如果是每小时一个批次的话,这里可能会存一个带小时的数字型时间如2019030108(YYYYMMDDHH),之所以存成数字型,是因为数字型占的空间更小,检索更快,另外在书写SQL是也比较简便。当然也可根据需要设为字符型或日期型。PROCESSTIME字段用来表示数据被抽取加载到ODS表的系统时间,该字段也可以省略。另外如果ODS表中的数据来自于多个数据源,则可以增加一个审计字段来表示数据的来源。
对于某些没有时间戳的维度表、代码表,其对应的ODS表要如何设计呢?其实也和上边的表一样,只需要在源表的结构之前增加批次号等审计字段即可,比如用户信息表:

如果无法通过时间戳或操作日志来判断哪些用户信息发生了改变的话,则每次抽取数据时选择全量抽取,即将源表中的这个时点的数据全部抽到ODS表,由于每次的快照都已存储下来,虽然有较大的冗余,但却非常便于在后续的ETL中利用比对的方式来判断哪些数据发生了变化。如果数据量较大,也可以采用表分区的方式。
如何快速批量的创建ODS表?
源系统的数据库类型多种多样,其中的表成百上千,针对这么多需要抽取的源表,有什么简便的方式能快速生成对应这些源表的ODS表吗?HaoheDI提供了一个的功能可以快速生成这些表,操作步骤如下:
1、在数据连接中选择要生成ODS表的目标数据库(数据中心),点击创建ODS表按钮:

2、弹出页面后,点击“选择源表”,选择对应的源连接和源表。如图:选择源数据库LOCALMYSQL中的这6张源表作为在HYDW目标数据库中对应的ODS表的模板。

3、删减部分表中不必要的字段,这样在ODS表中将不会创建这个字段,默认是创建全部字段。

4、设置ODS表的命名规则,比如在源表名之前增加O_,也可以在表名之后添加后缀。

5、在自定义字段一栏中,选择要在ODS表中添加的审计字段:

示例:每个表都将创建三个审计字段,设定其名称、字段类型、字段长度以及创建位置,保存。

6、其它表如果各项设定相同则选择同上即可,按Ctrl键选择全部或部分表,点击创建ODS表按钮

显示ODS表创建成功或失败的信息,建表语句在后台hhdilogs\common\日志中查看。

7、在目标数据连接的元数据中将新生成的ODS表结构导入:

查看表结构,检查表结构是否符合设定的规则。

创建完ODS表后,可以通过导入Excel模板的方式批量创建数据抽取任务。
浅谈ETL架构中ODS的作用以及如何在HaoheDI中自动创建ODS表的更多相关文章
- [原创] 浅谈ETL系统架构如何测试?
[原创] 浅谈ETL系统架构如何测试? 来新公司已入职3个月时间,由于公司所处于互联网基金行业,基金天然固有特点,基金业务复杂,基金数据信息众多,基金经理众多等,所以大家可想一下,基民要想赚钱真不容易 ...
- 浅谈Java的反射机制和作用
浅谈Java的反射机制和作用 作者:Java大师 欢迎转载,转载请注明出处 很多刚学Java反射的同学可能对反射技术一头雾水,为什么要学习反射,学习反射有什么作用,不用反射,通过new也能创建用户对象 ...
- 浅谈[0,1]区间内的n个随机实数变量中增加偏序关系类题目的解法
浅谈[0,1]区间内的n个随机实数变量中增加偏序关系类题目的解法 众所周知,把[0,1]区间内的n个随机.相互独立的实数变量\(x_i\)之间的大小关系写成一个排列\(\{p_i\}\),使得\(\f ...
- [Android 泥水匠] Android基础 之一:浅谈Android架构到HelloWorld案例的剖析
作者:泥沙砖瓦浆木匠网站:http://blog.csdn.net/jeffli1993个人签名:打算起手不凡写出鸿篇巨作的人,往往坚持不了完成第一章节. 交流QQ群:[编程之美 365234583] ...
- 浅谈SDN架构下的运维工作
导读 目前国内的网络运维还处于初级阶段,工作人员每天就像救火一样,天天疲于奔命.运维人员只能埋头查找系统运行的日志,耗时耗力,老眼昏花不说,有时候忙了半天还一无所获,作为运维工程师的你,有木有遇到过类 ...
- 转--浅谈ETL
ETL是将业务系统的数据经过抽取.清洗转换之后加载到数据仓库的过程,目的是将企业中的分散.零乱.标准不统一的数据整合到一起,为企业的决策提供分析依据. ETL是BI项目重要的一个环节. 通常情况下,在 ...
- 浅谈Android架构之MVP,MVVM
概述 MVP(Model-View-Presenter)是传统MVC(Model-View-Controller)在Android开发上的一种变种.进化模式.主要用来隔离UI.UI逻辑和业务逻辑.数据 ...
- 浅谈MySQL架构体系
一 数据库和数据库实例 在MySQL的学习研究中,存在两个非常容易混淆的概念,即数据库和数据库实例.在MySQL中,数据库和数据库实例定义如下: 数据库:存储数据的集合: 数据库实例:操作数据库的集 ...
- 以用户注册功能模块为例浅谈MVC架构下的JavaWeb开发流程
JavaWeb应用开发,撇开分布式不谈,只讨论一个功能服务应用的开发,无论是使用原生的Servlet/JSP方案,还是时下的SSM架构,都有一套经过工程实践考验的最佳实践,这综合考虑了团队协作.项目管 ...
随机推荐
- 一次查找sqlserver死锁的经历
查找bug是程序员的家常便饭,我身边的人喜欢让用户来重现问题.当然他们也会从正式服务器上下载错误log,然后尝试分析log,不过当错误不是那种不经思考就可识别的情况,他们就会将问题推向用户,甚至怪罪程 ...
- centos无法用password登录,只能用public key的解决办法
如上图只能用public key登录,只是我在17年申请的阿里云免费体验半年的服务器上遇到的, 那么我们用阿里云后台的远程连接按钮进入服务器,进入后 就看/etc/ssh/sshd_config文件配 ...
- Docker的安装及加速
使用 yum 安装(CentOS 7下) Docker 要求 CentOS 系统的内核版本高于 3.10 ,查看本页面的前提条件来验证你的CentOS 版本是否支持 Docker . 通过 uname ...
- GO语言(六)接口使用
<music> |------<src> |-------<library> |-------manager.go |-------manager_test.go ...
- 「uoj#188. 【UR #13】Sanrd」
题目 不是很能看懂题意,其实就是求\([l,r]\)区间内所有数的次大质因子的和 这可真是看起来有点鬼畜啊 这显然不是一个积性函数啊,不要考虑什么特殊的函数了 我们考虑Min_25筛的过程 设\(S( ...
- ThinkPHP3.2.3快速入门:基础篇
一.安装 thinkphp无需安装,只需将从官网上下载的压缩包解压后,把所有文件放到localhost根目录里就行了 二.压缩包中文件简述 :应用程序文件夹.自己所写的文件都放在这个文件夹里面 :公用 ...
- VMware12上安装CentOS无法上网问题
进入/etc/sysconfig/network-scripts目录下,查看有没有ifcfg-XXX的文件(ifcfg-lo除外), 没找到网卡设备,原因:由于Vmware虚拟网卡和Linux兼容问题 ...
- Vue中better-scroll插件的使用
实现原理:父容器固定高度,并设置属性overflow: hidden,使得子元素高度超出容器后能被隐藏.better-scroll作用在父容器上.1.npm安装better-scroll插件.npm ...
- HDU 1017A Mathematical Curiosity (暴力统计特殊要求个数)
传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1017 A Mathematical Curiosity Time Limit: 2000/1000 M ...
- linux mysql命令行查看显示中文
linux 命令行查看mysql的库字符集是utf8,查询某个表时,仍然是显示不了中文, 之后使用了命令 mysql>set names utf8;就可以正常显示中文了. 如何才更好的使mys ...