load_fact_rental转换
load_fact_rental转换是作业load_rentals最后的转换。
作业load_rentals里所有之前的转换都是加载维度表,而此转换是ETL最后的加载fact_rental事实表。
load_fact_rental转换的结构与load_rentals作业中其他转换不同。其他转换大多数将数据反正规化,从而加载维度表,而此转换的本质在于计算度量值和查找相应的维度键。
- 变更数据捕获
转换的开始部分仍然使用两个 ”表输入“ 步骤。分别是 “ max_fact_rental_last_update ” 和 “ Get New Rentals to load ”步骤。
与其他转换相比,有两个不同的地方,这个转换使用rental_id 列来检测变化,而没有使用last_update列。因为rental_id 值可以自动递增,所以 rental_id 列与last_update列的原理相同。**唯一的缺点是:使用rental_id时,我们不能捕获到rental表的任何更新。**这里假设了源表不存在更新的情况。 - 获取日期时间智能键
智能键的值实际就是把日期和时间值转化成特定的字符串格式,通过步骤 “ Get data and time keys ” 来获得。这样在检索维度表的代理键是,不用再去查询维度表。 - 计算度量值
fact_rental表有三个度量值:
1. count_rentals:租借次数,这是所谓的非事实性事实。根据定义,如果在原rental表中有一行数据,就在fact_rental事实表中看作一次租借。在数据库上,给该度量列设置默认值1即可实现。
2. count_return:归还次数,本列用来设置租凭是否已归还,值是NULL(意味着迄今为止此租借没有归还)或 1 (意味着此租借已归还)。
3.rental_duration:租借时长,本列用来设置租借时间长短,值的设置取决于租借是否已归还,值是NULL(意味着迄今为止此租借没有归还)或租出日期和归还日期之间的时长,单位是秒。
因为fact_rental表同时记录租凭和归还,随着时间变化某个数据行的状态度量值可能改变。
过滤步骤 “ return date?” 负责检测是否有归还日期。如果有归还日期,数据流向计算器步骤 “ calculate rental duration ”,将count_returns度量值设置为1,再计算rental_duration的度量值,即用归还日期减去租凭日期。如果没有归还日期,数据流向 “ rental duration null ” 步骤,该步骤将度量值 count_returns 和 rental_duration 设置为空。
- 查询常规维度表中的键
在原sakila数据库中,rental表没有直接指向store表或film表,而是有一列inventory_id,指向inventory表,再由inventory表指向 store表和film表。所以,当我们查找维度的键值时,我们首先需要查找库存。通过 “ Lookup film_id and store_id(from inventory)” 步骤查找库存。得到film_id和store_id后,就可以再查找真正的维度键。 - 查询类型2缓慢变化维度的键
对于类型2的缓慢变化维度来说,不能简单地用原始的ID列查找维度,因为在类型2缓慢变化型维度中,每一个这样的ID值可以有多行。如果要从类型2缓慢变化维度表中查找行,需要知道ID已经上下文时间,这样才能找到正确的维度行。
如图,上述功能是通过 “ Lookup dim customer key”、“ Lookup dim store key”和“ Lookup dim staff key”等步骤实现的,它们都是 “ 维度查询/更新 ” 类型的步骤。这一次,这种类型的步骤是用于在加载事实表时,从维度中查找维度键,而不是用来向维度表中加载维度。 - 加载事实表
转换的最后一步是 “ 插入/更新 ” 步骤。因为这是一个累计快照事实表,所以我们需要在租凭状态发生变化时(即当有租借或归还业务发生时)能更新事实表。
到这里,Sakila示例数据库使用Kettle加载星型模型的关键技术解释完毕。