维度表处理
案例目的
通过本节内容的学习,介绍如何使用 UDI Studio 来管理维度表,尤其要了解 UDI Studio 的一些非常有用的功能,使用这些功能可以转换或生产维度表数据,并把这些数据加载到维度表里。
数据介绍
示例数据基于一个虚拟的 DVD 出租连锁店 Sakila,sakila 示例数据库的作者是 Mike Hillyer,他当时是 MySQL AB的技术文档工程师。自 sakila 示例数据库在2006年3月发布以来,便由 MySQL文档团队维护和销售。读者可以参考有关 MySQL 的文档来获得更多关于示例数据库的信息。也可参考 Uniplore 帮助文档里对 sakila 数据集的介绍2.7.1 sakila示例数据库和租赁业务星型模型。为了方便起见,读者可直接使用下方提供的 sakila 数据库 SQL 脚本。
其中,sakila-schema.sql 与 sakila-data.sql 用于创建 sakila 数据库,sakila_snowflake_schema.sql 用于创建演示中所用的雪花模型。在本示例中,系统从源数据库 sakila 抽取增量数据,然后添加到雪花维度表中。
生成代理键的两种方法
数据仓库最佳实践表明,原则上,维度表应该使用自动生成的无意义的整型数值作为代理键。但也有一些维度表不必遵循这个原则,但在本案例中,我们的代理键都遵循这个原则。
UDI Studio 提供了一些功能可以直接在转换里生成代理键,另外也支持通过数据库生成代理键。本节我们学习能生成代理键的步骤。
基于转换的第一种方式
下面介绍生 成代理键的第一种方法,该方法是使用“增加序列”和内部计数器生成代理键,工作流程如下所示:
在运行该转换时,会在运行转换的初始化阶段,先执行 "创建test_sequence" 步骤里的 SQL 语句。这是一个用来执行 SQL 脚本的组件,里面的内容创建了一个名为 wy_test_sequence 的维度表。
里面的 SQL 代码如下
create table if not exists wy_test_sequence (
id int not null primary key
)engine = Innodb;
初始化阶段完成后,在“生成记录”步骤中生成了 100 行空记录,这些行代表了要加载到 "wy_test_sequence" 维度表里的数据行。
紧接着通过"增加序列"步骤,给数据流添加了一个 "sequence_value" 自增序列字段。
sequence_value 字段只是一些预备数据,还不 能直接作为代理键。每次转换运行时,这些序列的起始值都是 1,和数据库里已有数据的代理键重复。为解决这个问题,需要把序列值和表里的最大值相加。我们使用一个"表输入"组件来获取 test_sequence 表里的代理键最大值。
表输入步骤里的SQL语句如下,如果维度表中存在数据返回最大 id,如果维度表中无数据返回为 0:
SELECT COALESCE(MAX(id),0) as MaxId
FROM wy_test_sequence