维度模型数据仓库(七) —— 按需装载

来源:互联网 发布:美国医疗大数据公司 编辑:程序博客网 时间:2024/05/17 04:24
(五)进阶技术
        2. 按需装载
        前面已经做了“初始装载”和“定期装载”。还有一种需要熟悉的装载类型,按需装载。所谓“按需装载”指的是,在正常调度之外,当源数据有效时或者数据仓库需要时进行装载。例如,促销销售源数据只有在促销期内有效,而在其它时间是无效的。

        在“准备数据仓库模拟环境”中讨论的“生成日期维度数据”可以看做是一种按需装载。数据仓库预先装载了日期,当日期用完时,需要再次运行预装载。

        本篇的主题是按需装载,首先修改数据库模式,然后在dw数据库上执行按需装载。使用促销期场景进行说明。定期装载不适合促销期场景,因为促销期数据并不是按调度装载。下面是需要装载的促销期内容,存储在名为一个promo_schedule.csv的CSV平面文件中。

PROMOTION CODE,PROMOTION NAME,START DATE,LAST DATE
SO,Special Offer,2015-04-01,2015-04-10
DP,Disk Promotion,2015-05-05,2015-05-20
MS,Month Special,2015-06-01,2015-06-30
MS,Monitor Promotion,2015-07-10,2015-07-15
BS,Back to School,2015-08-10,2015-08-30

        注意源数据提供了促销周期,而不是单个的促销日期。示例假设只需要装载今后新的促销数据,而在数据仓库中不需要促销期的历史数据。

        修改数据库模式
        图(五)- 2-1 显示了修改后的模式,date_dim表增加了promo_ind列,用来标识该日期是否为促销日期。使用清单(五)-2-1里的SQL脚本修改数据库模式。脚本中还建立了一个促销过渡表,用来装载促销期CSV文件的内容。
图(五)- 2-1

USE dw;TRUNCATE promo_schedule_stg;LOAD DATA INFILE '/root/data-integration/promo_schedule.csv'INTO TABLE promo_schedule_stgFIELDS TERMINATED BY ','LINES TERMINATED BY '\n'IGNORE 1 LINES( promo_code, promo_name, promo_start_date, promo_last_date ) ;UPDATE date_dim a,    promo_schedule_stg b SET     a.promo_ind = 'Y'WHERE    a.date >= b.promo_start_date        AND a.date <= b.promo_last_date ;COMMIT ;
清单(五)-2-1

        清单(五)-2-2里是执行按需装载SQL脚本。需要在日期装载后运行该脚本,换句话说,所有促销期内从开始到结束的日期,在日期维度里都是存在的。实际上装载所做的就是,如果一个日期在一个促销期内,则设置date_dim表的promo_ind列为‘Y’。

        使用Kettle步骤装载促销期很容易,不需要使用过渡表,只要三个步骤即可,如图(五)- 2-2到(五)- 2-7所示。
USE dw;TRUNCATE promo_schedule_stg;LOAD DATA INFILE '/root/data-integration/promo_schedule.csv'INTO TABLE promo_schedule_stgFIELDS TERMINATED BY ','LINES TERMINATED BY '\n'IGNORE 1 LINES( promo_code, promo_name, promo_start_date, promo_last_date ) ;UPDATE date_dim a,    promo_schedule_stg b SET     a.promo_ind = 'Y'WHERE    a.date >= b.promo_start_date        AND a.date <= b.promo_last_date ;COMMIT ;
清单(五)-2-2

图(五)- 2-2

图(五)- 2-3

图(五)- 2-4

图(五)- 2-5

图(五)- 2-6

图(五)- 2-7

假设转换名称是on_demand,用以下命令执行转换:
cd /root/data-integration
./pan.sh -rep kettle -user admin -pass admin -dir / -trans on_demand -level=basic > on_demand.log

验证结果应该如下所示:
mysql> select * from date_dim where date >= '2015-04-01' and date <= '2015-04-10';
+---------+------------+------------+-------+---------+------+-----------+----------------+-------------+
| date_sk | date       | month_name | month | quarter | year | promo_ind | effective_date | expiry_date |
+---------+------------+------------+-------+---------+------+-----------+----------------+-------------+
|    5570 | 2015-04-01 | April      |     4 |       2 | 2015 | Y         | 0000-00-00     | 9999-12-31  |
|    5571 | 2015-04-02 | April      |     4 |       2 | 2015 | Y         | 0000-00-00     | 9999-12-31  |
|    5572 | 2015-04-03 | April      |     4 |       2 | 2015 | Y         | 0000-00-00     | 9999-12-31  |
|    5573 | 2015-04-04 | April      |     4 |       2 | 2015 | Y         | 0000-00-00     | 9999-12-31  |
|    5574 | 2015-04-05 | April      |     4 |       2 | 2015 | Y         | 0000-00-00     | 9999-12-31  |
|    5575 | 2015-04-06 | April      |     4 |       2 | 2015 | Y         | 0000-00-00     | 9999-12-31  |
|    5576 | 2015-04-07 | April      |     4 |       2 | 2015 | Y         | 0000-00-00     | 9999-12-31  |
|    5577 | 2015-04-08 | April      |     4 |       2 | 2015 | Y         | 0000-00-00     | 9999-12-31  |
|    5578 | 2015-04-09 | April      |     4 |       2 | 2015 | Y         | 0000-00-00     | 9999-12-31  |
|    5579 | 2015-04-10 | April      |     4 |       2 | 2015 | Y         | 0000-00-00     | 9999-12-31  |
+---------+------------+------------+-------+---------+------+-----------+----------------+-------------+
10 rows in set (0.10 sec)

        在五个促销期里有共有83的促销日。第一个周期有10天(2015年4月1日、2015年4月2日;…2015年4月10日),第二个促销周期有16天(2015年5月5日,2015年5月6日;…2015年5月20日),等等。查询第一个周期应该有10天的promo_ind列上具有Y值。
0 0