初始装载只在开始数据仓库使用前执行一次,然而,必须按时调度定期执行ETL。
与初始装载不同,定期装载一般都是增量的,而且需要捕获并记录数据的变化历史
1、变化数据捕捉
数据获取处理需要重点考虑增量抽取,也被称为变化数据捕获,简称CDC
假设一个数据仓库系统,在每天夜里的业务低峰时间从操作型源系统抽取数据,那么增量抽取只需要过去24小时内发生变化的数据。变化数据捕获也是建立准实时数据仓库的关键技术
2、变化数据捕获方法
常用的变化数据捕获方法有时间戳、快照、触发器和日志4种
1) 时间戳方法需要源系统有相应的数据列表示最后的数据变化
2) 快照方法可以使用数据库系统自带的机制实现,如Oracle的物化视图技术,也可以自己实现相关逻辑,但会比较复杂
3) 触发器是关系数据库系统具有的特性,源表上建立的触发器会在对该表执行insert、update、delete等语句时被触发,触发器中的逻辑用于捕获数据的变化
4) 日志可以使用应用日志或系统日志,这种方式对源系统不具有侵入性,但需要额外的日志解析工作
3、识别数据源与装载类型
定期装载首先要识别数据仓库的每个事实表和每个维度表用到的并且是可用的源数据。然后决定适合装载的抽取模式和维度历史装载类型
4、处理渐变维(SCD)
在捕获数据变化时,需要使用维度表的当前版本数据与从业务数据库最新抽取来的数据做比较
实现方式是在维度表上建立一个当前维度版本的视图,用于比较数据变化,既可以保留所有数据变化的历史,又屏蔽了查询当前版本的复杂性
事实表需要引用维度表的代理键,而且不一定是引用当前版本的代理键。比如有些迟到的事实,就必须找到事实发生时的维度版本。因此一个维度的所有版本区间应该构成一个连续且互斥时间范围,每个事实数据都能对应维度的唯一版本。实现方式是在维度表上建立一个维度历史版本的视图,在这个视图中增加版本过期日期导出列。任何一个版本的有效期是一个“左闭右开”的区间,也就是说该版本包含生效日期,但不包含过期日期,而是到过期日期的前一天为止。ETL粒度为每天执行一次,也即一天内的数据变化将被忽略
5、设置数据处理时间窗口
对于事实表,采用基于时间戳的CDC增量装载模式,时间粒度为天。因此需要两个时间点,分别表示本次装载的起始时间点和终止时间点,这两个时间点定义了本次处理的时间窗口,即装载这个时间区间内的数据。还要说明一点,这个区间是左包含的,就是处理的数据包括起始时间点的,但不包括终止时间点的。这样设计的原因是,我们既要处理完整的数据,不能有遗漏,又不能重复装载数据,这就要求时间处理窗口既要连续,又不能存在重叠的部分
6、设置数据处理时间窗口
7、创建维度表版本视图
8、创建历史版本视图
维度表数据可能是新增、修改或删除。这里用FULL JOIN连接原始数据表与维度当前版本视图,统一处理这三种情况。外查询中使用CASE语句判断属于哪种情况,分别取得不同的字段值
装载事实表时连接维度历史视图,引用事实数据所对应的维度代理键。该代理键可以通过维度版本的生效日期、过期日期区间唯一确定