????
目錄
一.學習目標
二.案例介紹
? ? ? ??2.1.案例背景介紹
? ? ? ? 2.2.數(shù)據(jù)倉庫的架構(gòu)模型
三.數(shù)據(jù)準備
? ? ? ??3.1.數(shù)據(jù)庫sakila的下載和安裝
? ?? ? ?3.2.數(shù)據(jù)庫sakila簡介
四.案例實現(xiàn)
? ? ? ?4.1加載日期數(shù)據(jù)至日期維度表
? ? ? ?4.2?加載時間數(shù)據(jù)至時間維度表
???????4.3?加載員工數(shù)據(jù)至員工維度表
? ? ? ?4.4加載用戶數(shù)據(jù)至用戶維度表
? ? ? ?4.5加載商店數(shù)據(jù)至商店維度表
???????4.6 加載演員數(shù)據(jù)至演員維度表
一.學習目標
????????了解數(shù)據(jù)庫sakila中的數(shù)據(jù)表
????????理解數(shù)據(jù)倉庫sakila_dw 的架構(gòu)設計
????????熟悉DVD租賃商店的業(yè)務流程
????????掌握構(gòu)建DVD租賃商店數(shù)據(jù)倉庫的具體實現(xiàn)
二.案例介紹
? ? ? ? 概要:sakila樣本數(shù)據(jù)庫是MySQL官方提供的一個模擬DVD租賃商店管理的數(shù)據(jù)庫。本章,我們將綜合運用前面幾章的知識,對數(shù)據(jù)庫sakila中的數(shù)據(jù)進行清洗操作,從而構(gòu)建一個DVD租賃商店數(shù)據(jù)倉庫系統(tǒng),即實現(xiàn)定期從源數(shù)據(jù)庫sakila中抽取增量數(shù)據(jù),轉(zhuǎn)換成符合DVD租賃業(yè)務的數(shù)據(jù),最后加載到目標數(shù)據(jù)倉庫中。
? ? ? ??2.1.案例背景介紹
????????????????在日益激烈的商業(yè)競爭中,在線DVD租賃商店的決策者都迫切地需要更加準確的戰(zhàn)略決策信息。每個在線DVD租賃商店的數(shù)據(jù)都存儲在數(shù)據(jù)庫中,因此該數(shù)據(jù)庫中擁有海量的數(shù)據(jù),并不缺乏足夠的信息,但是這些數(shù)據(jù)并不是戰(zhàn)略決策需要的信息。雖然這些海量數(shù)據(jù)對于在線DVD租賃商店的運作是非常有用的,但是對于商業(yè)的戰(zhàn)略決策和目標制定的作用是微乎其微的。
????????????????對于在線DVD租賃商店的決策者來說,他們需要從多個不同的商業(yè)角度觀察數(shù)據(jù),例如時間、電影、演員、用戶等角度觀察數(shù)據(jù),并進行相關的分析得出決策,但是數(shù)據(jù)庫中的數(shù)據(jù)不適合從多個角度進行分析,無法得出戰(zhàn)略決策。然而,數(shù)據(jù)倉庫支持復雜的分析操作,側(cè)重于決策支持,并且還提供直觀易懂的查詢結(jié)果,因此我們需要基于數(shù)據(jù)庫sakila創(chuàng)建一個DVD租賃商店數(shù)據(jù)倉庫,并將sakila數(shù)據(jù)庫中的數(shù)據(jù)加載到數(shù)據(jù)倉庫中,便于在線DVD租賃商店的決策者對數(shù)據(jù)進行分析得出商業(yè)決策。
? ? ? ? 2.2.數(shù)據(jù)倉庫的架構(gòu)模型
????????????????數(shù)據(jù)倉庫sakila_dw的架構(gòu)模型是一個星型模型,其中dim_film表、dim_customer表、dim_actor表、dim_store表、dim_staff表、dim_date表以及dim_time表均為維度表;fact_rental表為事實表。
????????????????sakila_dw.sql(數(shù)據(jù)庫中表是空的,無記錄)
/*
SQLyog Community v13.1.6 (64 bit)
MySQL - 8.0.26 : Database - sakila_dw
*********************************************************************
*/
/*!40101 SET NAMES utf8 */;
/*!40101 SET SQL_MODE=''*/;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
CREATE DATABASE /*!32312 IF NOT EXISTS*/`sakila_dw` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci */ /*!80016 DEFAULT ENCRYPTION='N' */;
USE `sakila_dw`;
/*Table structure for table `dim_actor` */
DROP TABLE IF EXISTS `dim_actor`;
CREATE TABLE `dim_actor` (
`actor_key` int NOT NULL AUTO_INCREMENT,
`actor_last_update` datetime NOT NULL,
`actor_last_name` varchar(45) NOT NULL,
`actor_first_name` varchar(45) NOT NULL,
`actor_id` int NOT NULL,
PRIMARY KEY (`actor_key`)
) ENGINE=MyISAM AUTO_INCREMENT=601 DEFAULT CHARSET=latin1;
/*Table structure for table `dim_customer` */
DROP TABLE IF EXISTS `dim_customer`;
CREATE TABLE `dim_customer` (
`customer_key` int NOT NULL AUTO_INCREMENT,
`customer_last_update` datetime NOT NULL DEFAULT '1970-01-01 00:00:00',
`customer_id` int DEFAULT NULL,
`customer_first_name` varchar(45) DEFAULT NULL,
`customer_last_name` varchar(45) DEFAULT NULL,
`customer_email` varchar(50) DEFAULT NULL,
`customer_active` char(3) DEFAULT NULL,
`customer_created` date DEFAULT NULL,
`customer_address` varchar(64) DEFAULT NULL,
`customer_district` varchar(20) DEFAULT NULL,
`customer_postal_code` varchar(10) DEFAULT NULL,
`customer_phone_number` varchar(20) DEFAULT NULL,
`customer_city` varchar(50) DEFAULT NULL,
`customer_country` varchar(50) DEFAULT NULL,
`customer_version_number` smallint DEFAULT NULL,
`customer_valid_from` date DEFAULT NULL,
`customer_valid_through` date DEFAULT NULL,
PRIMARY KEY (`customer_key`),
KEY `customer_id` (`customer_id`) USING BTREE
) ENGINE=MyISAM AUTO_INCREMENT=4794 DEFAULT CHARSET=latin1;
/*Table structure for table `dim_date` */
DROP TABLE IF EXISTS `dim_date`;
CREATE TABLE `dim_date` (
`date_key` int NOT NULL,
`date_value` date NOT NULL,
`date_short` char(12) NOT NULL,
`date_medium` char(16) NOT NULL,
`date_long` char(24) NOT NULL,
`date_full` char(32) NOT NULL,
`day_in_year` smallint NOT NULL,
`day_in_month` tinyint NOT NULL,
`is_first_day_in_month` char(10) NOT NULL,
`is_last_day_in_month` char(10) NOT NULL,
`day_abbreviation` char(3) NOT NULL,
`day_name` char(12) NOT NULL,
`week_in_year` tinyint NOT NULL,
`week_in_month` tinyint NOT NULL,
`is_first_day_in_week` char(10) NOT NULL,
`is_last_day_in_week` char(10) NOT NULL,
`month_number` tinyint NOT NULL,
`month_abbreviation` char(3) NOT NULL,
`month_name` char(12) NOT NULL,
`year2` char(2) NOT NULL,
`year4` smallint NOT NULL,
`quarter_name` char(2) NOT NULL,
`quarter_number` tinyint NOT NULL,
`year_quarter` char(7) NOT NULL,
`year_month_number` char(7) NOT NULL,
`year_month_abbreviation` char(8) NOT NULL,
PRIMARY KEY (`date_key`),
UNIQUE KEY `date` (`date_value`) USING BTREE,
UNIQUE KEY `date_value` (`date_value`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
/*Table structure for table `dim_film` */
DROP TABLE IF EXISTS `dim_film`;
CREATE TABLE `dim_film` (
`film_key` int NOT NULL AUTO_INCREMENT,
`film_last_update` datetime NOT NULL,
`film_title` varchar(64) NOT NULL,
`film_description` text NOT NULL,
`film_release_year` smallint NOT NULL,
`film_language` varchar(20) NOT NULL,
`film_original_language` varchar(20) NOT NULL,
`film_rental_duration` tinyint DEFAULT NULL,
`film_rental_rate` decimal(4,2) DEFAULT NULL,
`film_duration` int DEFAULT NULL,
`film_replacement_cost` decimal(5,2) DEFAULT NULL,
`film_rating_code` char(5) DEFAULT NULL,
`film_rating_text` varchar(30) DEFAULT NULL,
`film_has_trailers` char(4) DEFAULT NULL,
`film_has_commentaries` char(4) DEFAULT NULL,
`film_has_deleted_scenes` char(4) DEFAULT NULL,
`film_has_behind_the_scenes` char(4) DEFAULT NULL,
`film_in_category_action` char(4) DEFAULT NULL,
`film_in_category_animation` char(4) DEFAULT NULL,
`film_in_category_children` char(4) DEFAULT NULL,
`film_in_category_classics` char(4) DEFAULT NULL,
`film_in_category_comedy` char(4) DEFAULT NULL,
`film_in_category_documentary` char(4) DEFAULT NULL,
`film_in_category_drama` char(4) DEFAULT NULL,
`film_in_category_family` char(4) DEFAULT NULL,
`film_in_category_foreign` char(4) DEFAULT NULL,
`film_in_category_games` char(4) DEFAULT NULL,
`film_in_category_horror` char(4) DEFAULT NULL,
`film_in_category_music` char(4) DEFAULT NULL,
`film_in_category_new` char(4) DEFAULT NULL,
`film_in_category_scifi` char(4) DEFAULT NULL,
`film_in_category_sports` char(4) DEFAULT NULL,
`film_in_category_travel` char(4) DEFAULT NULL,
`film_id` int NOT NULL,
PRIMARY KEY (`film_key`)
) ENGINE=MyISAM AUTO_INCREMENT=3001 DEFAULT CHARSET=latin1;
/*Table structure for table `dim_film_actor_bridge` */
DROP TABLE IF EXISTS `dim_film_actor_bridge`;
CREATE TABLE `dim_film_actor_bridge` (
`film_key` int NOT NULL,
`actor_key` int NOT NULL,
`actor_weighting_factor` decimal(3,2) DEFAULT NULL,
PRIMARY KEY (`film_key`,`actor_key`),
KEY `dim_actor_dim_film_actor_bridge_fk` (`actor_key`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
/*Table structure for table `dim_staff` */
DROP TABLE IF EXISTS `dim_staff`;
CREATE TABLE `dim_staff` (
`staff_key` int NOT NULL AUTO_INCREMENT,
`staff_last_update` datetime NOT NULL DEFAULT '1970-01-01 00:00:00',
`staff_first_name` varchar(45) DEFAULT NULL,
`staff_last_name` varchar(45) DEFAULT NULL,
`staff_id` int DEFAULT NULL,
`staff_store_id` int DEFAULT NULL,
`staff_version_number` smallint DEFAULT NULL,
`staff_valid_from` date DEFAULT NULL,
`staff_valid_through` date DEFAULT NULL,
`staff_active` char(3) DEFAULT NULL,
PRIMARY KEY (`staff_key`),
KEY `staff_id` (`staff_id`) USING BTREE
) ENGINE=MyISAM AUTO_INCREMENT=19 DEFAULT CHARSET=latin1;
/*Table structure for table `dim_store` */
DROP TABLE IF EXISTS `dim_store`;
CREATE TABLE `dim_store` (
`store_key` int NOT NULL AUTO_INCREMENT,
`store_last_update` datetime NOT NULL DEFAULT '1970-01-01 00:00:00',
`store_id` int DEFAULT NULL,
`store_address` varchar(64) DEFAULT NULL,
`store_district` varchar(20) DEFAULT NULL,
`store_postal_code` varchar(10) DEFAULT NULL,
`store_phone_number` varchar(20) DEFAULT NULL,
`store_city` varchar(50) DEFAULT NULL,
`store_country` varchar(50) DEFAULT NULL,
`store_manager_staff_id` int DEFAULT NULL,
`store_manager_first_name` varchar(45) DEFAULT NULL,
`store_manager_last_name` varchar(45) DEFAULT NULL,
`store_version_number` smallint DEFAULT NULL,
`store_valid_from` date DEFAULT NULL,
`store_valid_through` date DEFAULT NULL,
PRIMARY KEY (`store_key`),
KEY `store_id` (`store_id`) USING BTREE
) ENGINE=MyISAM AUTO_INCREMENT=8 DEFAULT CHARSET=latin1;
/*Table structure for table `dim_time` */
DROP TABLE IF EXISTS `dim_time`;
CREATE TABLE `dim_time` (
`time_key` int NOT NULL,
`time_value` time NOT NULL,
`hours24` tinyint NOT NULL,
`hours12` tinyint DEFAULT NULL,
`minutes` tinyint DEFAULT NULL,
`seconds` tinyint DEFAULT NULL,
`am_pm` char(3) DEFAULT NULL,
PRIMARY KEY (`time_key`),
UNIQUE KEY `time_value` (`time_value`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
/*Table structure for table `fact_rental` */
DROP TABLE IF EXISTS `fact_rental`;
CREATE TABLE `fact_rental` (
`customer_key` int NOT NULL,
`staff_key` int NOT NULL,
`film_key` int NOT NULL,
`store_key` int NOT NULL,
`rental_date_key` int NOT NULL,
`return_date_key` int NOT NULL,
`rental_time_key` int NOT NULL,
`count_returns` int NOT NULL,
`count_rentals` int NOT NULL,
`rental_duration` int DEFAULT NULL,
`rental_last_update` datetime DEFAULT NULL,
`rental_id` int DEFAULT NULL,
KEY `dim_store_fact_rental_fk` (`store_key`),
KEY `dim_staff_fact_rental_fk` (`staff_key`),
KEY `dim_time_fact_rental_fk` (`rental_time_key`),
KEY `dim_film_fact_rental_fk` (`film_key`),
KEY `dim_date_fact_rental_fk` (`rental_date_key`),
KEY `dim_customer_fact_rental_fk` (`customer_key`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
三.數(shù)據(jù)準備
? ? ? ??3.1.數(shù)據(jù)庫sakila的下載和安裝
????????????????我們可以從MySQL的官網(wǎng)下載數(shù)據(jù)庫sakila的建庫腳本,若是在Windows環(huán)境下安裝數(shù)據(jù)庫sakila,則下載名稱為sakila-db.zip的壓縮包文件;若是在Linux環(huán)境下安裝數(shù)據(jù)庫sakila,需要下載名稱為sakila-db.tar.gz的壓縮包文件。 本次下載的是名稱為sakila-db.zip的壓縮包文件,該壓縮包文件中包含三個文件,分別是文件sakila.mwb、文件sakila-data.sql和文件sakila-schema.sql。其中,文件sakila.mwb是一個MySQL Workbench數(shù)據(jù)模型,用于查看數(shù)據(jù)庫結(jié)構(gòu);文件sakila-data.sql是用于創(chuàng)建數(shù)據(jù)庫sakila的數(shù)據(jù);文件sakila-schema.sql是用于創(chuàng)建數(shù)據(jù)庫sakila的數(shù)據(jù)結(jié)構(gòu)。
????????????????數(shù)據(jù)庫sakila下載完成后,直接解壓壓縮包,然后使用MySQL圖形化管理軟件SQLyog(本文使用navicat)先運行腳本文件sakila-schema.sql創(chuàng)建數(shù)據(jù)庫sakila和數(shù)據(jù)表,再運行腳本文件sakila-data.sql向數(shù)據(jù)庫sakila中的數(shù)據(jù)表加載數(shù)據(jù),最后刷新數(shù)據(jù)庫并查看數(shù)據(jù)庫sakila中的數(shù)據(jù)表及數(shù)據(jù)表中的數(shù)據(jù),若數(shù)據(jù)表中均含有數(shù)據(jù)則說明安裝數(shù)據(jù)庫sakila成功,否則說明安裝不成功,需要重新解壓安裝。 需要注意的是,安裝數(shù)據(jù)庫sakila之前需要下載并安裝MySQL關系型數(shù)據(jù)庫,并且版本不可以低于5.0。
? ?? ? ?3.2.數(shù)據(jù)庫sakila簡介
????????????????數(shù)據(jù)庫sakila中一共含有十六張數(shù)據(jù)表,分別是actor(演員)表、address(地址)表、category(類別)表、city(城市)表、country(國家)表、customer(顧客)表、film(電影)表、film_actor(演員所屬電影)表、film_category(電影所屬的類別)表、film_text(電影描述)表、inventory(庫存)表、language(語言)表、payment(付款)表、rental(租賃)表、staff(工作人員)表以及store(商店)表。
? ? ? ? ? ? ? ? sakila建庫SQL語句:點擊獲取
四.案例實現(xiàn)
????????我們基于數(shù)據(jù)庫sakila構(gòu)建一個星型模型的DVD租賃商店數(shù)據(jù)倉庫,并命名為sakila_dw。數(shù)據(jù)倉庫sakila_dw中的事實表fact_rental是根據(jù)數(shù)據(jù)庫sakila中的數(shù)據(jù)表rental創(chuàng)建的;維度表是根據(jù)數(shù)據(jù)表sakila中數(shù)據(jù)表的分類創(chuàng)建的,即從人員、時間、地點以及事件四個角度進行創(chuàng)建數(shù)據(jù)倉庫sakila_dw的維度表,具體如下: 從人員角度角度創(chuàng)建維度表dim_customer和維度表dim_staff,分別表示租賃業(yè)務中的客戶和員工; 從時間角度創(chuàng)建維度表dim_date和維度表dim_time,用于記錄所有DVD的租賃時間和歸還時間; 從地點角度創(chuàng)建維度表dim_store,用于記錄DVD光盤是從哪個商店租賃的; 從事件角度創(chuàng)建維度表dim_actor和維度表dim_film,其中維度表dim_actor用于記錄演員的基本信息,維度表dim_film用于記錄電影的基本信息。由于電影是租賃和歸還的實際對象,因此維度表dim_film應與事實表fact_rental關聯(lián)。一部電影是由多位演員出演,所以會有橋接表dim_film_actor_bridge,該表將電影與演員相關聯(lián)。
? ? ? ?4.1加載日期數(shù)據(jù)至日期維度表
????????????????通過Kettle工具加載日期數(shù)據(jù)至dim_date日期維度表。
? ? ??(1)打開kettle創(chuàng)建轉(zhuǎn)換
???????(2)配置控件
? ? ? ? ? 生成記錄控件:雙擊進入生成記錄控件,在“限制”處添加生成的日期,默認為10,這里改為3650,即生成10年的日期(10*365);在“字段”框添加字段language(語言)、country_code(國家碼)、initial_date(初始化的日期),對生成的日期進行初始化,具體如圖所示。
? ? ? ? ?增加?序列控件:雙擊“增加序列”控件,進入“增加序列”配置界面,并在“值的名稱”處將valuename改為DaySequence,即增加一列日期字段,后續(xù)用于改變“生成記錄”控件生成的日期,如圖所示。
? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? JavaScript代碼:雙擊“JavaScript”控件,進入“JavaScript”配置界面,勾選“兼容模式?”處的復選框,使得JavaScript代碼控件的兼容性更強;在Java Script代碼框中編寫代碼(代碼見下方),如圖所示。
? ? ? ? 代碼寫好后,點擊下方獲取變量將字段添加到下方,如上圖。
? ? ? ? 個人經(jīng)驗:在填寫好后字段后,建議查看一遍字段類型,將date字段數(shù)據(jù)類型改為Date,其余的都改為string。此建議只是在我運行時,數(shù)據(jù)庫中寫不進去記錄后所做的,僅供參考,具體看自己實踐情況。
? ? ? ? JavaScript代碼:
//Script here
//生成locale
var locale = new java.util.Locale(language.getString(),country_code.getString());
//生成Calendar
var calendar = new java.util.GregorianCalendar(locale);
//設置時間
calendar.setTime(initial_date.getDate());
//設置日歷為當前日期
calendar.add(calendar.DAY_OF_MONTH,DaySequence.getInteger()-1);
//獲取日期
var date = new java.util.Date(calendar.getTimeInMillis());
//生成短日期
var date_short = java.text.DateFormat.getDateInstance(java.text.DateFormat.SHORT,locale).format(date);
//生成中日期
var date_medium = java.text.DateFormat.getDateInstance(java.text.DateFormat.MEDIUM,locale).format(date);
//生成長日期
var date_long = java.text.DateFormat.getDateInstance(java.text.DateFormat.LONG,locale).format(date);
//生成全日期
var date_full = java.text.DateFormat.getDateInstance(java.text.DateFormat.FULL,locale).format(date);
//簡單格式化
var simpleDateFormat = java.text.SimpleDateFormat("D",locale);
//天在年的第幾天
var day_in_year = simpleDateFormat.format(date);
//建立格式器
simpleDateFormat.applyPattern("d");
//天在月的第幾天
var day_in_month = simpleDateFormat.format(date);
simpleDateFormat.applyPattern("EEEE");
//星期的名稱
var day_name = simpleDateFormat.format(date);
simpleDateFormat.applyPattern("E");
//星期的縮寫
var day_abbreviation = simpleDateFormat.format(date);
simpleDateFormat.applyPattern("ww");
//一年的第幾周
var week_in_year = simpleDateFormat.format(date);
simpleDateFormat.applyPattern("W");
//一月的第幾周
var week_in_month = simpleDateFormat.format(date);
simpleDateFormat.applyPattern("MM");
//月份
var month_number = simpleDateFormat.format(date);
simpleDateFormat.applyPattern("MMMM");
//月的名稱
var month_name = simpleDateFormat.format(date);
simpleDateFormat.applyPattern("MMM");
//月的縮寫
var month_abbreviation = simpleDateFormat.format(date);
simpleDateFormat.applyPattern("yy");
//兩位的年
var year2 = simpleDateFormat.format(date);
simpleDateFormat.applyPattern("yyyy");
//四位的年
var year4 = simpleDateFormat.format(date);
//季度名稱
var quarter_name = "Q";
//季度
var quarter_number;
switch(parseInt(month_number)){
case 1:case 2:case 3:quarter_number = "1";break;
case 4:case 5:case 6:quarter_number = "2";break;
case 7:case 8:case 9:quarter_number = "3";break;
case 10:case 11:case 12:quarter_number = "4";break;
}
quarter_name += quarter_number;
//定義常量
var yes = "yes";
var no = "no";
//獲取周的第一天
var first_day_of_week = calendar.getFirstDayOfWeek();
var day_of_week = java.util.Calendar.DAY_OF_WEEK;
//判斷是否為周的第一天
var is_first_day_in_week;
if(first_day_of_week == calendar.get(day_of_week)){
is_first_day_in_week = yes;
}else{
is_first_day_in_week = no;
}
//日歷的下一天
calendar.add(calendar.DAY_OF_MONTH,1);
//獲取下一天
var next_day = new java.util.Date(calendar.getTimeInMillis());
//判斷是否周的最后一天
var is_last_day_in_week;
if(first_day_of_week == calendar.get(day_of_week)){
is_last_day_in_week = yes;
}else{
is_last_day_in_week = no;
}
//判斷是否為月的第一天
var is_first_day_in_month;
if(day_in_month == 1){
is_first_day_in_month = yes;
}else{
is_first_day_in_month = no;
}
//判斷是否為月的最后一天
var is_last_day_in_month;
if(java.text.SimpleDateFormat("d",locale).format(next_day)==1){
is_last_day_in_month = yes;
}else{
is_last_day_in_month = no;
}
//年_季度
var year_quarter = year4 + "-" + quarter_name;
//年_月份
var year_month_number = year4 + "-" + month_number;
//年_月縮寫
var year_month_abbreviation = year4 + "-" + month_abbreviation;
//日期代理劍(唯一鍵)
var date_key = year4 + month_number + (day_in_month<10?"0":"") + day_in_month;
? ? ? ? 表輸出控件: 雙擊進入表輸出控件,連接好數(shù)據(jù)庫,選擇目標表為dim_date,具體如下
?????????目標表選好后,勾選指定數(shù)據(jù)庫字段,點擊下方數(shù)據(jù)庫字段,單擊【輸入字段映射】按鈕,彈出“映射匹配”對話框,依次選中“源字段”選項框的字段和“目標字段”選項框的字段,再單擊【Add】按鈕,將一對映射字段添加至“映射”選項框中,具體如下:
? ? ? ? ?(3)保存運行
運行時間較長請耐心等待.........
數(shù)據(jù)庫中部分數(shù)據(jù),共3650條數(shù)據(jù)
? ? ? ? 4.2?加載時間數(shù)據(jù)至時間維度表
? ? ? ?(1)操作介紹
????????????????通過Kettle工具加載時間數(shù)據(jù)至日期維度表dim_time。
? ? ? ? (2)打開kettle創(chuàng)建轉(zhuǎn)換
? ? ? ? ?(3)配置控件
? ? ? ? ? ?生成記錄控件:雙擊“生成記錄”控件,進入“生成記錄”配置界面,在“限制”處添加生成的時間,這里添加的是生成24小時數(shù)據(jù),起始的時間為0;在“字段”框添加生成小時字段的相關信息,如圖所示。
? ? ? ? ? 增加序列控件:雙擊“增加序列”控件,進入“增加序列”配置界面,將“值的名稱”處將valuename改為hours24,即增加一列小時字段,由于時間是由時分秒構(gòu)成,因此我們需要生成時分秒字段的數(shù)據(jù),這里生成24小時數(shù)據(jù),后續(xù)步驟中會生成60分和60秒的數(shù)據(jù),如圖所示。
? ? ? ? ? ??
? ? ? ? ? JavaScript代碼控件:雙擊“JavaScript代碼”控件,進入“JavaScript代碼”界面,勾選“兼容模式?”處的復選框,使得JavaScript代碼控件的兼容性更強;在Java Script代碼框中編寫代碼;單擊【獲取變量】按鈕,將代碼中定義的變量添加至字段框。JavaScript代碼控件的配置如圖所示。
//生成12小時格式
var hours12=hours24.getInteger()%12;
//生成AM,PM格式
var am_pm=hours24.getInteger()>12?"PM":"AM";
? ? ? ? ? ?生成記錄2控件:雙擊“生成記錄2”控件,進入“生成記錄”界面,在“限制”后的文本框添加60表示生成60條數(shù)據(jù)(60分鐘從0分開始至59分結(jié)束共60條數(shù)據(jù));在“字段”框添加生成字段的名稱、字段類型及默認值為0,如圖所示。
? ? ? ? ? ?增加序列2控件:雙擊“增加序列2”控件,進入“增加序列2”界面,將“值的名稱”處將valuename改為minutes,即增加一列分鐘字段,用于記錄分鐘數(shù),在起始值后的文本框內(nèi)將默認值1修改為0,表示從0開始生成60條數(shù)據(jù)(上一步“生成記錄2”控件限制了條數(shù)),即生成數(shù)據(jù)為0-59,如圖所示。
? ? ? ? ? ?生成記錄3控件:雙擊“生成記錄3”控件,進入“生成記錄”界面,在“限制”后的文本框添加60,表示生成60條數(shù)據(jù)(即60秒鐘從0秒開始至59秒結(jié)束共60條數(shù)據(jù));在“字段”框添加生成字段的名稱、字段類型及默認值為0,如圖所示。
? ? ? ? ? ?增加序列3控件:雙擊“增加序列3”控件,進入“增加序列3”界面,將“值的名稱”處將valuename改為minutes,即增加一列秒字段,用于記錄秒數(shù),在起始值后的文本框內(nèi)將默認值1修改為0,表示從0開始生成60條數(shù)據(jù)(上一步驟中“生成記錄3”控件限制了條數(shù)),即生成數(shù)據(jù)為0-59,如圖所示。
? ? ? ? ? 記錄關聯(lián)(笛卡爾輸出)控件:這一步不需要配置?
? ? ? ? ? JavaScript代碼2控件:雙擊“JavaScript代碼2”控件,進入“JavaScript代碼2”界面,勾選“兼容模式?”處的復選框,使得JavaScript代碼2控件的兼容性更強;在Java Script代碼框中編寫代碼;單擊【獲取變量】按鈕,將代碼中定義的變量添加至字段框。JavaScript代碼2控件的配置,如圖所示。? ? ? ? ? ?
?JavaScript2代碼:
//生成time
var time=hours24.getInteger()+":"
+minutes.getInteger()+":"
+seconds.getInteger();
//time_key
var time_key=(hours24.getInteger()<10?"0":"")
+hours24.getInteger()+(minutes.getInteger()<10?"0":"")
+minutes.getInteger()+(seconds.getInteger()<10?"0":"")
+seconds.getInteger();
? ? ? ? ? ?表輸出控件:雙擊進入表輸出控件,單擊目標表右側(cè)的【瀏覽】按鈕,選擇輸出的目標表,即維度表dim_time;勾選“指定數(shù)據(jù)庫字段”的復選框,用于將維度表dim_time的字段與JavaScript 控件流中的字段進行匹配,如圖所示。
? ? ? ? ? ?映射匹配:勾選指定數(shù)據(jù)庫字段,點擊數(shù)據(jù)庫字段,選擇輸入字段映射,進行映射匹配。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ?(4)保存運行
? ? ? ? ? ? ? ? 總共有86400條記錄,執(zhí)行時間可能較長,一定要耐心等待?。?!
?????????數(shù)據(jù)庫中部分記錄
????????4.3?加載員工數(shù)據(jù)至員工維度表
? ? ? ? ? (1)操作介紹
????????????????通過Kettle工具加載員工數(shù)據(jù)至員工維度表dim_staff。
? ? ? ? ? (2)打開kettle創(chuàng)建轉(zhuǎn)換
? ? ? ? ? ?(3)配置控件
? ? ? ? ? ? ? ? 表輸入控件:雙擊“表輸入”控件,進入“表輸入”配置界面,單擊【新建】按鈕,配置數(shù)據(jù)? ? ? ? ? ?庫連接,配置完成后單擊【確認】按鈕。MySQL數(shù)據(jù)庫連接的配置,如圖所示。
????????????????注意:這里的數(shù)據(jù)庫是sakila_dw數(shù)據(jù)庫??!
?????????在SQL框中編寫SQL語句,用于獲取字段staff_last_update中的最大值,將該值替換為”1970-01-01 00:00:00”并賦值給臨時字段max_dim_staff_last_update;單擊“預覽”按鈕,查看臨時字段max_dim_staff_last_update是否將默認值設置為“1970-01-01 00:00:00”,如圖所示。
? ? ? ? ? ?
? ? ? ? ? 表輸入2控件 :雙擊“表輸入2”控件,進入“表輸入”配置界面,單擊【新建】按鈕,配置數(shù)據(jù)庫連接,配置完成后單擊【確認】按鈕。MySQL數(shù)據(jù)庫連接的配置,如圖所示。? ? ? ? ??
?文章來源:http://www.zghlxwxcb.cn/news/detail-486399.html
? ? ? ? ?注意:這里的數(shù)據(jù)庫是sakila數(shù)據(jù)庫,可通過新建來連接,連接名稱記得不能和表輸入控件的一樣,否則會顯示連接已存在。
????????在SQL框中編寫SQL語句,用于獲取sakila數(shù)據(jù)庫中staff數(shù)據(jù)表中的最新數(shù)據(jù),如圖所示。
? ? ? ? ?
? ? ? ? ? 字段選擇控件:雙擊“字段選擇”控件,進入“選擇/改名值”界面,在“元數(shù)據(jù)”選項卡的“需要改變元數(shù)據(jù)的字段”處添加字段active,由于數(shù)據(jù)倉庫sakila_dw中字段staff_active的數(shù)據(jù)類型為char類型,因此,我們需要將數(shù)據(jù)表staff中字段active的數(shù)據(jù)類型改為String類型,如圖所示。?
? ? ? ? ? 值映射控件:雙擊“值映射”控件,進入“值映射”界面,在“使用的字段名”處的下拉框選擇字段active;在“字段值”框中,添加源值和目標值,這里是將Y替換成Yes,將N替換成No,如圖所示。?
? ? ? ? ? 維度查詢/更新控件:?雙擊“維度查詢/更新”控件,進入“維度查詢/更新”界面,單擊目標表右側(cè)的【瀏覽】按鈕,選擇輸出的目標表,即維度表dim_staff;在“關鍵字”選項卡處添加關鍵字字段staff_id,用于指定維度表字段和值映射控件流中字段的比較條件,若維度表中的數(shù)據(jù)有更新,則通過字段staff_id進行更新操作;在“字段”選項卡處添加查詢/更新字段,用于更新目標維度表中的字段數(shù)據(jù);在“代理關鍵字段”處的下拉框中選擇staff_key為代理關鍵字段,并指定“創(chuàng)建代理鍵”是使用自增字段;在“Version字段”處的下拉框中選擇staff_version_number;在“Stream日期字段”處的下拉框中選擇last_update;在“開始日期字段”處的下拉框中選擇staff_valid_from;在“截止日期字段”處的下拉框中選擇staff_valid_through,如下圖所示。
? ? ? ? ?注意:這次的的數(shù)據(jù)庫連接是sakila_dw數(shù)據(jù)庫?。?!
? ? ? ? (4)保存運行
?通過navicat工具,查看數(shù)據(jù)表dim_staff是否已成功插入員工數(shù)據(jù),查看結(jié)果如圖所示。
? ? ? ? 4.4加載用戶數(shù)據(jù)至用戶維度表
? ? ? ? ? (1)操作介紹
? ? ? ? ?????????通過Kettle工具加載用戶數(shù)據(jù)至用戶維度表dim_customer。
? ? ? ? ? (2)打開kettle,建立轉(zhuǎn)換
? ? ? ? ? ? ? ? 轉(zhuǎn)換1:
? ? ? ? ????????轉(zhuǎn)換2:
? ? ? ? 注意:下面的轉(zhuǎn)換在映射(子轉(zhuǎn)換)控件中會用到,并且在4.5中也會用到,提前建立好,配置步驟我會在下面講解。
? ? ? ? ? (3)轉(zhuǎn)換2控件配置
? ? ? ? ? ? ? ? 映射輸入規(guī)范控件:雙擊“映射輸入規(guī)范”控件,進入“Mapping input specification”界面,
? ? ? ? ? ?并添加映射的字段“address_id”,該字段為傳遞的參數(shù)(由于轉(zhuǎn)換load_dim_customer中表
? ? ? ? ? 輸入2控件流獲取的字段address_id,用于查詢用戶的地址信息,而后續(xù)數(shù)據(jù)倉庫的維度表
? ? ? ? ? 數(shù)據(jù)也需要用戶的地址信息,因此這里將字段address_id作為傳遞的參數(shù)),添加完畢后單
? ? ? ? ? 擊【確定】按鈕,完成“映射輸入規(guī)范”控件的配置,如圖所示。
? ? ? ??
? ? ? ? ? ? ? ? ?數(shù)據(jù)庫查詢控件:雙擊進入控件,單擊名右側(cè)的【瀏覽】按鈕,添加數(shù)據(jù)表address;
? ? ? ? ?在“查詢所需的關鍵字”框中,添加查詢所需的關鍵字字段address_id,由于該字段是唯一的,
? ? ? ? 因此可作為數(shù)據(jù)表address中數(shù)據(jù)和映射輸入規(guī)范控件流中數(shù)據(jù)的比較條件;在“查詢表返回的
? ? ? ? 值”框中,添加查詢表返回的值,如圖所示。? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ?數(shù)據(jù)庫查詢2控件:雙擊進入控件,單擊名右側(cè)的【瀏覽】按鈕,添加數(shù)據(jù)表address;
? ? ? ?在“查詢所需的關鍵字”框中,添加查詢所需的關鍵字字段address_id,由于該字段是唯一的,
? ? ? ?因此可作為數(shù)據(jù)表address中數(shù)據(jù)和映射輸入規(guī)范控件流中數(shù)據(jù)的比較條件;在“查詢表返回的
? ? ? 值”框中,添加查詢表返回的值,如圖所示。
? ? ? ? ? ? ? ? ?數(shù)據(jù)庫查詢3控件:雙擊進入控件,單擊表名處的【瀏覽】按鈕,添加數(shù)據(jù)表country;
? ? ? ? ?在“查詢所需的關鍵字”框中,添加查詢所需的關鍵字字段country_id,用于指定字段流與表字
? ? ? ? ?段的數(shù)據(jù)進行比較的比較條件;在“查詢表返回的值”框中,添加查詢表返回的值,如圖所
? ? ? ? ?示。
? ? ? ? ? ? ? ? 過濾記錄控件:雙擊“過濾記錄”控件,進入“過濾記錄”配置界面,在“條件”處設置過濾的
? ? ? ? 條件,對有第二個地址的用戶進行過濾操作;單擊左邊“<field>”框,彈出字段對話框,選擇要
? ? ? ? 過濾的字段address2,如圖所示。
? ? ? ? ? ? ? ? ?JavaScript代碼控件:雙擊“JavaScript代碼”控件,進入“JavaScript代碼”配置界面,
? ? ? ? ? 勾選“兼容模式?”處的復選框,使得JavaScript代碼控件的兼容性更強;在Java Script代
? ? ? ? ?碼框中編寫代碼,如圖所示。
? ? ? ? ? ? ? ? ?字段選擇控件:雙擊“字段選擇”控件,進入“選擇/改名值”界面,在“元數(shù)據(jù)”選項卡的“移
? ? ? ? 除”處添加要移除的字段,如圖所示。
? ? ? ? ? ?(4)轉(zhuǎn)換1控件配置
? ? ? ? ? ? ? ? 表輸入控件:雙擊進入控件,在SQL框中編寫用于獲取字段customer_last_update中的
? ? ? ? 最大值,將該值替換為”1970-01-01 00:00:00”并賦值給臨時字段
? ? ? ?max_dim_customer_last_update;單擊“預覽”按鈕,查看臨時字段
? ? ? ?max_dim_customer_last_update是否將默認值設置為“1970-01-01 00:00:00”,如圖所示。
? ? ? ? ? ? ? ? ?表輸入2控件:雙擊進入控件配置界面,在SQL框中編寫SQL語句,用于獲取數(shù)據(jù)庫
? ? ? ? ?sakila中數(shù)據(jù)表customer中的最新數(shù)據(jù),如圖所示。
? ? ? ? ? ? ? ? ?映射(子轉(zhuǎn)換)控件:雙擊“映射”控件,進入“映射”界面,單擊“映射轉(zhuǎn)換”選項卡處的
? ? ?【瀏覽】按鈕,選擇添加轉(zhuǎn)換2(我演示選擇的文件實際就是轉(zhuǎn)換2,只不過我的名字不是轉(zhuǎn)換
? ? ? ?2),用于獲?取用戶的地址信息,如圖所示。
? ? ? ? ? ? ? ? ?字段選擇控件:雙擊步驟1中的“字段選擇”控件,進入“選擇/改名值”界面,在“元數(shù)據(jù)”選
? ? ? ? ?項卡的“需要改變元數(shù)據(jù)的字段”處添加字段active,由于數(shù)據(jù)表customer中字段active的類型
? ? ? ? ?為tinyint,因此需要將字段active的類型改為String,與維度表dim_customer中字段
? ? ? ? ?customer_active的類型相對應,如圖所示。
? ? ? ? ? ? ? ? ?值映射控件:雙擊步驟1中的“值映射”控件,進入“值映射”界面,在“使用的字段名”處的
? ? ? ? ? ?下拉框選擇字段active;在“字段值”框中,添加源值和目標值,由于數(shù)據(jù)表customer中字段? ? ? ? ? ? ?active的值為1和0,對應的是Y和N,這里將Y替換成Yes,將N替換成No,如圖所示。
????????????????維度查詢/更新”控件?:雙擊進入控件,單擊目標表右側(cè)的【瀏覽】按鈕,選擇輸出的目
? ? ? ? ?標表,即維度表dim_customer;在“關鍵字”選項卡處添加關鍵字字段customer_id,用于
? ? ? ? 指定維度表字段和流字段的比較條件;在“字段”選項卡處添加查詢/更新字段;在“代理關鍵字
? ? ? ?段”處的下拉框中選擇customer_key為代理關鍵字段,并指定“創(chuàng)建代理鍵”是使用自增字
? ? ? ?段;在“Version字段”處的下拉框中選擇customer_version_number;在“Stream日期字段”
? ? ? 處的下拉框中選擇last_update;在“開始日期字段”處的下拉框中選擇
? ? customer_valid_from;在“截止日期字段”處的下拉框中選擇customer_valid_through,如圖
? ?所示。
? ? ? ? ? ? (5)保存運行
只展示部分數(shù)據(jù)
?
? ? ? ? 4.5加載商店數(shù)據(jù)至商店維度表
? ? ? ? ? (1)操作介紹
????????????????通過Kettle工具加載商店數(shù)據(jù)至商店維度表dim_store。
? ? ? ? ? (2)打開kettle,建立轉(zhuǎn)換
? ? ? ? ? ?(3)配置控件
? ? ? ? ? ? ? ? 表輸入控件:雙擊進入表輸入控件,在SQL框中編寫SQL語句,用于獲取字段
? ? ? ? store_last_update中的最大值,將該值替換為”1970-01-01 00:00:00”并賦值給臨時字段
? ? ? ? max_dim_store_last_update;單擊“預覽”按鈕,查看臨時字段max_dim_store_last_update是
? ? ? ? 否將默認值設置為“1970-01-01 00:00:00” ,如圖所示。
? ? ? ? ? ? ? ? 表輸入2控件:雙擊進入表輸入2控件,在SQL框中編寫SQL語句,用于獲取sakila數(shù)據(jù)
? ? ? ? 庫中store數(shù)據(jù)表中的最新數(shù)據(jù),如圖所示。
? ? ? ? ? ? ? ? 映射(子轉(zhuǎn)換)控件:雙擊“映射”控件,進入“映射”界面,單擊“映射轉(zhuǎn)換”選項卡處的
? ? ? 【瀏覽】按鈕,選擇添加轉(zhuǎn)換2(4.5步驟中的轉(zhuǎn)換2,我起的名字和本文說的不一樣),用于
? ? ? ?獲取用戶的地址信息,如圖所示。
? ? ? ? ? ? ? ? 數(shù)據(jù)庫查詢控件:雙擊進入控件配置界面,單擊表名右側(cè)的【瀏覽】按鈕,添加staff數(shù)
? ? ? ? 據(jù)表,用于查詢商店員工的信息;在“查詢所需的關鍵字”框中,添加查詢所需的關鍵字
? ? ? ?staff_id,用于指定表字段和流字段的比較條件;在“查詢表返回的值”框中,添加查詢表返回的
? ? ? ?值,即員工姓名,如圖所示。
? ? ? ? ? ? ? ? 維度查詢/更新控件:單擊【瀏覽】按鈕,選擇輸出的目標表,即維度表dim_store;在
? ? ? ? “關鍵字”選項卡處添加關鍵字字段store_id,用于指定維度表字段和流字段的比較條件;在“字
? ? ? ? 段”選項卡處添加查詢/更新字段,用于指定維度表字段store_id和流字段store_id數(shù)據(jù)一致需要
? ? ? ?更新的字段,;在“代理關鍵字段”處的下拉框中選擇store_key為代理關鍵字段,并指定“創(chuàng)建
? ? ? 代理鍵”是使用自增字段;在“Version字段”處的下拉框中選擇store_version_number;在
? ? ?“Stream日期字段”處的下拉框中選擇last_update;在“開始日期字段”處的下拉框中選擇
? ? ?store_valid_from;在“截止日期字段”處的下拉框中選擇store_valid_through,如圖所示。
?
? ? ? ? ?(4)保存運行
?數(shù)據(jù)庫中數(shù)據(jù):
? ? ? ? ?
????????4.6 加載演員數(shù)據(jù)至演員維度表
? ? ? ? ? (1)操作介紹
????????????????通過Kettle工具加載演員數(shù)據(jù)至演員維度表dim_actor。
? ? ? ? ?(2)打開kettle,建立如下轉(zhuǎn)換
? ? ? ? ?(3)配置控件
? ? ? ? ? ? ? ? 表輸入控件:雙擊進入控件,在SQL框中編寫SQL語句,用于獲取字段
? ? ? ?actor_last_update中的最大值,將該值替換為”1970-01-01 00:00:00”并賦值給臨時字段
? ? ? max_dim_actor_last_update;單擊“預覽”按鈕,查看臨時字段max_dim_actor_last_update是
? ? ?否將默認值設置為“1970-01-01 00:00:00”,如圖所示。
? ? ? ? ????????表輸入2控件:雙擊進入表輸入2控件,在SQL框中編寫SQL語句,用于獲取數(shù)據(jù)庫sakila
? ? ? ? 中數(shù)據(jù)表actor中的最新數(shù)據(jù),如圖所示。?
? ? ? ? ? ? ? ? 插入/更新控件:單擊目標表右側(cè)的【瀏覽】按鈕,彈出“數(shù)據(jù)庫瀏覽器”窗口,選擇目標
? ? ? ? 表,即維度表dim_actor,單擊【獲取字段】按鈕,用來指定查詢數(shù)據(jù)所需要的關鍵字,這里
? ? ? ?選?擇的是dim_actor數(shù)據(jù)表中的actor_id字段和輸入流里面的actor_id字段;單擊【獲取和更
? ? ? 新字段】按鈕,用來指定需要更新的字段,如圖所示。
? ? ? ? ? ?(4)保存運行
?部分數(shù)據(jù):
?
本篇文章并不完善,后期我會逐漸完善,請見諒?。?!文章來源地址http://www.zghlxwxcb.cn/news/detail-486399.html
到了這里,關于第8章 綜合案例—構(gòu)建DVD租賃商店數(shù)據(jù)倉庫的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!