事实表加载
案例介绍
开始之前,我们先来了解一下什么是事实表。事实表是用于分析的详细的业务数据的集合,它数据量大,会消耗大量的存储。在一个典型的数据仓库环境中,事实表会占用大部分存储空间,事实表的大小可以到几个G、几个T,甚至几个P的数据。为了把数据从源系统中加载到数据仓库里,需要一个快速加载机制,为了快速加载,大多数数据库系统都提供了批量加载方式,批量加载方式通常规避了数据库的事务引擎,直接把数据写入到目标表。本案例将介绍Uniplore几个快速实现加载事实表的组件。
说明:尽管本部分的主题是加载事实表,Uniplore批量加载的功能也可以用于其他批量加载工作,例如把文本文件加载到数据缓冲区。
在把数据加载到最终的目的表之前,还要做一些其他操作,例如:查询正确的维度代理键。记住加载事实表是ETL过程的最后一步。首先,数据从业务系统中抽取出来,并写入到一个缓冲区文件或数据库表。然后,要更新所有的维度表,最后使用更新后的维度去加载事实表。尽管这个处理数据的过程看上去简单,但实际中并不容易做好。维度数据或者事实数据都可能会晚到,此时就需要处理迟到数据这种情况,本案例也会介绍怎么去处理迟到数据。
数据说明
本案例说用到数据源来至Sakila数据库,Sakila 是 MySQL 中的一个示例数据库(sample database),提供了一个标准的方案,可用于自学,写书,教程,文章以及示例等。详细介绍请参考 Sakila数据集介绍 。关于Sakila数据库读者亦可参考相关的官方文档。为了方便 起见,读者可直接使用下方提供的 sakila 数据库 SQL 脚本。
其中,sakila-schema.sql 与 sakila-data.sql 用于创建sakila据库,sakila_dwh_schema.sql和sakila_dwh_data.sql 用于创建演示中所用的雪花模型。在本示例中,系统从源数据库 sakila 抽取增量数据。然后添加到雪花维度表中。
事实表
在往数据仓库加载事实表之前,需要把数据准备好。加载事实表过程并不是重点,之所以把加载事实表单独分出来, 主要是为了强调如下三种不同类型的事实表。 事务粒度事实表:以每一个事务或事件为单位,例如一个销售记录、一个电话呼叫记录,作为事实表里的一行数据。 周期快照事实表:事实表里并不保存全部数据,只保存固定时间间隔的数据,例如每天或每月的库存水平,或每月的账户余额。 累积快照事实表:当有新的数据时,更新事实表里的记录。 数据仓库里总是保存最新的数据。例如订单过程,订单过程里有很多独立的日期,如订单日期、期望发货日期、实际发货日期、期望收货日期、实际收货日期和付款日期。当这个过程进行时,随着上面各种时间的出现,事实表里的记录也在不断更新。