Chinaunix首页 | 论坛 | 博客
  • 博客访问: 225966
  • 博文数量: 31
  • 博客积分: 1427
  • 博客等级: 上尉
  • 技术积分: 409
  • 用 户 组: 普通用户
  • 注册时间: 2006-04-04 15:21
文章分类

全部博文(31)

文章存档

2008年(31)

我的朋友

分类: Mysql/postgreSQL

2008-03-27 18:44:18

第二篇 提取、转换和加载

章节目录

5章:源数据提取

6章:导入时间维

7章:初始化导入

8章:定期导入

9章:周期导入计划

 

本篇概述

       在这部分,第二篇,讨论如何装载一个多维数据仓库的过程。该过程被称为:ETL,提取、转换和加载的简写。提取就是从数据源获得数据仓库需要的数据。转换是预处理数据的过程。而载入是在数据仓库中存储数据的过程。

E,TL并不总是相互独立的3个步骤。比如,如果源数据在mysql数据库中,那ETL过程将只是“insert select”的SQL语句。而在其他情况下,这个转换过程可能是非常麻烦的,不仅需要增加代理键,维护历史记录,而且集成多种数据源,处理源数据的异常,以及源数据的汇聚等。

本篇包括以下几个主题:

l        源数据提取

l        装载日期维

l        初始化装载

l        定期装载

l        定期调度和计划

 

5 源数据提取

 

概述

       装载数据仓库的第一个步骤是提取源数据。你既可以通过从数据源取得(拉动)数据还可以通过要求数据源发送(推动)数据到数据仓库中。

       源数据的数量和有效性是提取数据的重要考虑因数,这取决于你是全部提取,还是只是提取最近一次提取后发生变化的数据(增量提取)。

       本章讨论以下两个源数据提取的主题:

l        哪部分源数据需要提取并载入到数据仓库中?通常有两种方法:全部数据和变化数据的捕获。

l        源数据提取方法。有两种可能的模式,拉取模式(数据仓库拉取)和推送模式(由数据源推送)。

接下来的章节将说明上面提及的不同的数据源抽取模式,然后用销售订单数据的抽取来作为例子,展示如何用“源数据推送”的模式来改变抽取机制。

 

全部源数据还是变化数据捕获(CDC)

       如果数据的量可以承受的情况下你通常可以抽取全部的数据(文件的所有记录或者数据库表的所有行)。该模式一般适合参数型数据的抽取,比如邮政编码。参数型数据通常是维表的数据源。

       如果数据源的量是巨大的,并且提取所有数据是效率很低或者更本不可能的,你将不得不只提取改变过的数据(最后一次提取后新增或者发生变化的数据)。这种数据提取模式叫做变化数据捕获(CDC)。该模式通常用于提取操作事务型数据,比如销售订单。

       接下来的章节我将解释如何应用“数据源推送”的CDC模式进行销售订单数据的提取。第8章“定期装载“将涵盖另外的模式。

拉取数据还是由源推送

       如果你希望源数据只能等待数据仓库来提取数据,可以用拉取模式。然而你必须确定,当你的数据仓库开始提取数据的时候,源数据已经准备好并且可以使用。当你在第2章“维度历史“中运行scd1.sql脚本和scd2.sql脚本时,就是在使用这种拉取模式。

       如果你的数据提取时间点是苛刻的,并希望源数据准备好后能及时发送给你,则你可以使用由源推送的数据提取模式。一个让你不得不用这种模式的因素是:数据源受保护且不允许存取。

由源推送的CDC模式运用于销售订单数据提取

       我将在本节演示如何对销售订单数据源提取应用由源推送的CDC模式。由源推送的CDC模式意味着源数据只有在最后一次提取后发生改变才进行数据提取。这里的销售订单源数据,源系统指的是第1章“基本组成“中建立的source数据库。

       列表5-1中的脚本是一个存储过程,它将从source数据库中的sales_order表提取销售订单数据。该脚本每天捕获这个表的变化(这里假设你以天为周期向数据仓库载入数据)。

 

列表5-1:推送CDC 销售订单

/*****************************************************************/

/*                                                               */

/* push_sales_order.sql                                          */

/*                                                               */

/*****************************************************************/

 

/* point to source database                                      */

 

USE source;

 

DELIMITER // ;

 

DROP PROCEDURE IF EXISTS push_sales_order //

 

CREATE PROCEDURE push_sales_order()

BEGIN

 

INSERT INTO dw.sales_order_fact

SELECT

  a.order_amount

, b.order_sk

, c.customer_sk

, d.product_sk

, e.date_sk

FROM

  sales_order a

, dw.order_dim b

, dw.customer_dim c

, dw.product_dim d

, dw.date_dim e

WHERE

    a.entry_date = CURRENT_DATE

AND a.order_number = b.order_number

AND a.customer_number = c.customer_number

AND a.product_code = d.product_code

AND a.order_date >= d.effective_date

AND a.order_date <= d.expiry_date

AND a.order date = e.date

;

END

//

 

DELIMITER ; //

 

/* end of script      

 

你将在编译该存储过程并部署在source数据库中,并且将每天运行该脚本。这样,该脚本实现由源推送CDC模式的数据提取。

注意 该脚本后面粗体的那两行代码将通过订单日期来确保包含合法产品信息的销售订单被提取出来。

    编译和存储该存储过程可以用下面的命令

mysql> \. c:\mysql\scripts\push_sales_order.sql

你的控制台将显示:

Database changed

Query OK, 0 rows affected, 1 warning (0.08 sec)

 

Query OK, 0 rows affected (0.05 sec)

为了确保存储过程已经成功建立,调用Show procedure命令:

mysql> show procedure status like 'push_sales_order' \G;

你的控制台将显示:

*************************** 1. row ***************************

           Db: source

         Name: push_sales_order

         Type: PROCEDURE

      Definer: root@localhost

     Modified: 2007-02-05 22:26:56

      Created: 2007-02-05 22:26:56

Security_type: DEFINER

      Comment:

1 row in set (0.00 sec)

 

mysql>

阅读(2006) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~