什么是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模板的方式批量创建数据抽取任务。