mysql多维数据仓库指南--第二篇第7章(1)
时间:2008-04-22 来源:jiangdm
第七章 初始化导入
概述
在第6章,“装载日期维”,你学习了如何载入日期维度表。本章,你将学习如何载入事实表和其他维度表。
在你的数据仓库开始运作之前,你需要载入历史数据。历史数据是你装载数据库仓库最初的一批数据。这个最初的装载被称为初始化装载。
你数据仓库的用户将决定在数据仓库中他们需要多少的历史数据。比如,如果你的数据仓库是从2007-03-01开始,你的用户希望载入2年的历史数据,你将载入从2005-03-1到2007-02-28期间的源数据。然后,在数据仓库开始运作的2007-03-01这天,你将载入2007-03-01的数据。
在你装载事实表之前,你将载入所有的维度表,因为事实表需要维度表的代理键。这不仅在初始化载入,而且在以后定期装载的过程中都需要这么做。(定期装载在第8章讨论)。
本章,我将说明如何完成初始化装载,包括鉴别源数据,开发初始化装载脚本,以及测试脚本。
源数据
本小节,我将解释,在你可以开始写初始化装载脚本之前,有那些关于源数据的主要方面需要去判别。
第一步是判别哪些源数据是数据仓库中的事实表和维度表必须或者有用的。你还需要知道数据源的特性,比如文件类型,数据结构以及如何获取。
表格7-1是一个示例文档,概述了在这个销售订单数据仓库中源数据的关键信息,包括文件类型,格式和数据仓库目标表。
这种类型的表格通常称为数据源映射,因为它标识了每个数据从源到目标的对应关系。维护该表格的活动称为数据源的配置管理。
注意:客户和产品维相关的源数据被直接映射到它们在数据仓库中的目标表,及customer_dim 和 product_dim 表。另一方面,销售订单事务则是多个数据仓库表的源数据。你将在第20章中学习一个更为复杂的源数据,““不齐整数据源”。
表7-1:你的数据仓库的数据源
以表格的形式展示该表
源数据 |
数据类型 |
文件或者表名 |
数据仓库中的目标表 |
Customer |
CSV text file |
customer.csv |
customer_dim |
Product |
Fixed-width text file |
product.txt |
product_dim |
Sales order transaction |
MySQL |
sales_order in source database |
order_dim |
sales_order_fact |
|||
date_dim, if you use “Loading the Date from Source” option, but you’ll use pre-population here |
初始化载入脚本
现在你已经鉴别了数据源,是时候开始编写用来初始化装载的脚本了。假设你的数据仓库将从2007-03-01开始运作,而你希望载入两年的历史数据,你需要载入从2005-03-01到2007-02-28期间的源数据。
列表7-1的脚本作为一个示例,注意以下:
客户维和产品维的生效日期是2007-03-01,没有更早日期的销售订单被载入,这意味着,没有更早的客户维和产品维是必须的。
订单维的生效日期理所当然是是订单日期。
销售订单事实表的代理键字段被载入维度表的代理键值。
你需要另外用预装载的方式预载入日期维date_dim表,从2005-03-1到2010-12-31。
列表7-1:数据仓库初始化载入
/*****************************************************************/
/* */
/* dw_initial.sql */
/* */
/*****************************************************************/
USE dw;
LOAD DATA INFILE 'customer.csv'
INTO TABLE customer_stg
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\r\n'
IGNORE 1 LINES
( customer_number
, customer_name
, customer_street_address
, customer_zip_code
, customer_city
, customer_state )
;
INSERT INTO customer_dim
SELECT
NULL
, customer_number
, customer_name
, customer_street_address
, customer_zip_code
, customer_city
, customer_state
, '2005-03-01'
, '9999-12-31'
FROM
customer_stg
;
LOAD DATA INFILE 'product.txt'
INTO TABLE product_stg
FIELDS TERMINATED BY ''
OPTIONALLY ENCLOSED BY ''
LINES TERMINATED BY '\r\n'
IGNORE 1 LINES
( product_code
, product_name
, product_category )
;
INSERT INTO product_dim
SELECT
NULL
, product_code
, product_name
, product_category
, '2005-03-01'
, '9999-12-31'
FROM
product_stg
;
INSERT INTO order_dim
SELECT
NULL
, order_number
, order_date
, '9999-12-31'
FROM
source.sales_order
WHERE order_date >= '2005-03-01'
AND order_date < '2007-02-28'
;
INSERT INTO sales_order_fact
SELECT
order_sk
, customer_sk
, product_sk
, date_sk
, order_amount
FROM
source.sales_order a
, order_dim b
, customer_dim c
, product_dim d
, date_dim e
WHERE
a.order_number = b.order_number
AND a.customer_number = c.customer_number
AND a.product_code = d.product_code
AND a.order_date = e.date
AND order_date >= '2005-03-01'
AND order_date < '2007-02-28'
;
/* end of script