(五)进阶技术 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_stg
FIELDS 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_stg
FIELDS 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值。