維度模型資料倉庫(十五) —— 多重星型模式
10. 多重星型模式
從(五)進階技術1. “增加列”開始,已經通過增加列和表擴充套件了資料倉庫,在(五)進階技術5. “快照”裡增加了第二個事實表,month_end_sales_order_fact表。這之後資料倉庫模式就有了兩個事實表(第一個是在開始建立資料倉庫時建立的sales_order_fact表)。有了這兩個事實表的資料倉庫就是一個正式的雙星型模式。
本篇將在現有的維度資料倉庫上增加一個新的星型結構。與現有的與銷售關聯的星型結構不同,新的星型結構關注的是產品業務領域。新的星型結構有一個事實表和一個維度表,用於儲存資料倉庫中的產品資料。
一個新的星型模式
圖(五)- 10-1 顯示了擴充套件後的資料倉庫模式。模式中有三個星型結構。sales_order_fact表是第一個星型結構的事實表,與其相關的維度表是customer_dim、product_dim、date_dim和sales_order_attribute_dim表。month_end_sales_order_fact表是第二個星型結構的事實表。product_dim和month_dim是其對應的維度表。第一個和第二個星型結構共享product_dim維度表。第二個星型結構的事實表和月份維度資料分別來自於第一個星型結構的事實表和date_dim維度表。它們不從源資料獲得資料。第三個星型模式的事實表是新建的production_fact表。它的維度除了儲存在已有的date_dim和product_dim表,還有一個新的factory_dim表。第三個星型結構的資料來自源資料。
執行清單(五)- 10-1裡的指令碼建立第三個星型模式中的新表和對應的源資料表。
清單(五)- 10-1USE dw; CREATE TABLE factory_dim ( factory_sk INT NOT NULL AUTO_INCREMENT PRIMARY KEY, factory_code INT, factory_name VARCHAR(30), factory_street_address VARCHAR(50), factory_zip_code INT(5), factory_city VARCHAR(30), factory_state VARCHAR(2), version int, effective_date DATE, expiry_date DATE ); CREATE TABLE production_fact ( product_sk INT , production_date_sk INT , factory_sk INT , production_quantity INT ); ALTER TABLE production_fact ADD FOREIGN KEY (factory_sk) REFERENCES factory_dim(factory_sk) ON DELETE CASCADE ON UPDATE CASCADE ; ALTER TABLE production_fact ADD FOREIGN KEY (product_sk) REFERENCES product_dim(product_sk) ON DELETE CASCADE ON UPDATE CASCADE ; ALTER TABLE production_fact ADD FOREIGN KEY (production_date_sk) REFERENCES date_dim(date_sk) ON DELETE CASCADE ON UPDATE CASCADE ; USE source; CREATE TABLE factory_master ( factory_code INT, factory_name CHAR(30), factory_street_address CHAR(50), factory_zip_code INT(5), factory_city CHAR(30), factory_state CHAR(2) );
向新的星型結構表中匯入資料
假設factory_dim表儲存工廠資訊,並且從稱為factory_master的MySQL表獲得資料。可以使用清單(五)- 10-2裡的指令碼初始裝載工廠資料。
清單(五)- 10-2USE dw; INSERT INTO factory_dim SELECT NULL , factory_code , factory_name , factory_street_address , factory_zip_code , factory_city , factory_state , 1 , CURRENT_DATE , '2200-01-01' FROM source.factory_master; COMMIT;
使用Kettle轉換初始裝載工廠資料只需要一個表輸入和一個表輸出步驟即可,如圖(五)- 10-2到圖(五)- 10-4所示。
圖(五)- 10-2
圖(五)- 10-3
圖(五)- 10-4
工廠的資訊很少改變,所以可能希望在一個CSV檔案裡提供任何關於工廠的最新資訊。在/root/data-integration/factory.csv檔案中有一些示例工廠資訊。 就像其它CSV原始檔,需要一個過渡表裝載factory.csv檔案。執行清單(五)- 10-3裡的指令碼建立過渡表。
USE dw;
CREATE TABLE factory_stg (
factory_code INT,
factory_name VARCHAR(30),
factory_street_address VARCHAR(50),
factory_zip_code INT(5),
factory_city VARCHAR(30),
factory_state VARCHAR(2)
);
清單(五)- 10-3
第三個星型結構中的production_fact事實表,從源資料庫的daily_production表獲取資料。執行清單(五)- 10-4裡的指令碼建立這個表。
USE source;
CREATE TABLE daily_production (
product_code INT,
production_date DATE,
factory_code INT,
production_quantity INT
);
清單(五)- 10-4
可以使用清單(五)- 10-5裡的指令碼定期裝載工廠維度表和產品事實表。注意對factory_dim表的所有列都應用SCD1。該指令碼每天執行,裝載前一天的產品資料。說明:腳本里沒有使用cdc_time表,是出於簡化測試的目的。實際生產環境每天定期裝載應該共用一個排程,也即應該把清單(五)- 10-5裡的指令碼併入每天定期裝載指令碼中,並且針對使用cdc_time表做相應的修改。
USE dw;
-- 設定SCD的截止時間和生效時間
SET @pre_date = SUBDATE(CURRENT_DATE,1) ;
TRUNCATE factory_stg;
LOAD DATA INFILE '/root/data-integration/factory.csv'
INTO TABLE factory_stg
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY ""
LINES TERMINATED BY '\n'
IGNORE 1 LINES
( factory_code
, factory_name
, factory_street_address
, factory_zip_code
, factory_city
, factory_state );
/* SCD1 */
UPDATE
factory_dim a
, factory_stg b
SET
a.factory_name = b.factory_name
, a.factory_street_address = b.factory_street_address
, a.factory_zip_code = b.factory_zip_code
, a.factory_city = b.factory_city
, a.factory_state = b.factory_state
WHERE a.factory_code = b.factory_code;
/* add new factory */
INSERT INTO factory_dim
SELECT
NULL
, factory_code
, factory_name
, factory_street_address
, factory_zip_code
, factory_city
, factory_state
, 1
, @pre_date
, '2200-01-01'
FROM factory_stg
WHERE factory_code NOT IN (
SELECT y.factory_code
FROM factory_dim x, factory_stg y
WHERE x.factory_code = y.factory_code );
INSERT INTO production_fact
SELECT
b.product_sk
, c.date_sk
, d.factory_sk
, production_quantity
FROM
source.daily_production a
, product_dim b
, date_dim c
, factory_dim d
WHERE
production_date = @pre_date
AND a.product_code = b.product_code
AND a.production_date >= b.effective_date
AND a.production_date <= b.expiry_date
AND a.production_date = c.date
AND a.factory_code = d.factory_code ;
COMMIT ;
清單(五)- 10-5
Kettle定期裝載工廠維度表和產品事實表如圖(五)- 10-5到圖(五)- 10-22所示。
圖(五)- 10-6
圖(五)- 10-7
圖(五)- 10-8
圖(五)- 10-9
圖(五)- 10-10
圖(五)- 10-11
圖(五)- 10-12
圖(五)- 10-13
圖(五)- 10-14
圖(五)- 10-15
圖(五)- 10-16
圖(五)- 10-17
圖(五)- 10-18
圖(五)- 10-19
圖(五)- 10-20
圖(五)- 10-21
圖(五)- 10-22 測試
到目前為止已經討論了第三個星型結構裡的所有表,現在做一些測試。首先需要一些工廠資訊。執行清單(五)- 10-6裡的指令碼向源資料庫的factory_master表中裝載四個工廠資訊。執行完清單(五)- 10-5裡的指令碼以後,需要把系統日期設定成任意晚於上一篇“雜項維度”設定的日期。這裡設定系統日期為2015年3月18日。之後,執行清單(五)- 10-2裡的指令碼或對應的Kettle初始裝載轉換向factory_dim表裝載factory_master表裡的四個工廠資訊。
USE source;
INSERT INTO factory_master VALUES
( 1, 'First Factory', '11111 Lichtman St.', 17050,
'Mechanicsburg', 'PA' )
, ( 2, 'Second Factory', '22222 Stobosky Ave.', 17055, 'Pittsburgh',
'PA' )
, ( 3, 'Third Factory', '33333 Fritze Rd.', 17050, 'Mechanicsburg',
'PA' )
, ( 4, 'Fourth Factory', '44444 Jenzen Blvd.', 17055, 'Pittsburgh',
'PA' );
COMMIT ;
清單(五)- 10-6
執行下面的語句查詢factory_dim表,確認裝載正確。查詢結果顯示如下。
mysql> select * from factory_dim\G
*************************** 1. row ***************************
factory_sk: 1
factory_code: 1
factory_name: First Factory
factory_street_address: 11111 Lichtman St.
factory_zip_code: 17050
factory_city: Mechanicsburg
factory_state: PA
version: 1
effective_date: 2015-03-18
expiry_date: 2200-01-01
*************************** 2. row ***************************
factory_sk: 2
factory_code: 2
factory_name: Second Factory
factory_street_address: 22222 Stobosky Ave.
factory_zip_code: 17055
factory_city: Pittsburgh
factory_state: PA
version: 1
effective_date: 2015-03-18
expiry_date: 2200-01-01
*************************** 3. row ***************************
factory_sk: 3
factory_code: 3
factory_name: Third Factory
factory_street_address: 33333 Fritze Rd.
factory_zip_code: 17050
factory_city: Mechanicsburg
factory_state: PA
version: 1
effective_date: 2015-03-18
expiry_date: 2200-01-01
*************************** 4. row ***************************
factory_sk: 4
factory_code: 4
factory_name: Fourth Factory
factory_street_address: 44444 Jenzen Blvd.
factory_zip_code: 17055
factory_city: Pittsburgh
factory_state: PA
version: 1
effective_date: 2015-03-18
expiry_date: 2200-01-01
4 rows in set (0.00 sec)
執行清單(五)- 10-7裡的指令碼向源資料庫的daily_production表匯入資料 。
USE source;
INSERT INTO daily_production VALUES
(1, CURRENT_DATE, 4, 100 )
, (2, CURRENT_DATE, 3, 200 )
, (3, CURRENT_DATE, 2, 300 )
, (4, CURRENT_DATE, 1, 400 )
, (1, CURRENT_DATE, 1, 400 )
, (2, CURRENT_DATE, 2, 300 )
, (3, CURRENT_DATE, 3, 200 )
, (4, CURRENT_DATE, 4, 100 );
COMMIT;
清單(五)- 10-7
現在已經做好了測試產品定期裝載的準備。先把系統日期設定為2015年3月19日,然後執行清單(五)- 10-5裡的指令碼或對應的Kettle定期裝載作業。使用下面的SQL語句查詢production_fact表,確認每天產品資料的定期裝載是正確的。查詢結果顯示如下。
mysql> select * from production_fact;
+------------+--------------------+------------+---------------------+| product_sk | production_date_sk | factory_sk | production_quantity |
+------------+--------------------+------------+---------------------+
| 1 | 5556 | 4 | 100 |
| 2 | 5556 | 3 | 200 |
| 4 | 5556 | 2 | 300 |
| 5 | 5556 | 1 | 400 |
| 1 | 5556 | 1 | 400 |
| 2 | 5556 | 2 | 300 |
| 4 | 5556 | 3 | 200 |
| 5 | 5556 | 4 | 100 |
+------------+--------------------+------------+---------------------+
8 rows in set (0.00 sec)
為了確認工廠維度上成功應用了SCD1,使用下面的語句查詢factory_dim表。查詢結果顯示如下。
mysql> select * from factory_dim\G
*************************** 1. row ***************************factory_sk: 1
factory_code: 1
factory_name: First Factory
factory_street_address: 11111 Lichtman St.
factory_zip_code: 17050
factory_city: Mechanicsburg
factory_state: PA
version: 1
effective_date: 2015-03-18
expiry_date: 2200-01-01
*************************** 2. row ***************************
factory_sk: 2
factory_code: 2
factory_name: Second Factory
factory_street_address: 24242 Bunty La.
factory_zip_code: 17055
factory_city: Pittsburgh
factory_state: PA
version: 1
effective_date: 2015-03-18
expiry_date: 2200-01-01
*************************** 3. row ***************************
factory_sk: 3
factory_code: 3
factory_name: Third Factory
factory_street_address: 37373 Burbank Dr.
factory_zip_code: 17050
factory_city: Mechanicsburg
factory_state: PA
version: 1
effective_date: 2015-03-18
expiry_date: 2200-01-01
*************************** 4. row ***************************
factory_sk: 4
factory_code: 4
factory_name: Fourth Factory
factory_street_address: 44444 Jenzen Blvd.
factory_zip_code: 17055
factory_city: Pittsburgh
factory_state: PA
version: 1
effective_date: 2015-03-18
expiry_date: 2200-01-01
4 rows in set (0.00 sec)
注意 第二和第三個工廠已經正確修改了地址。
相關推薦
維度模型資料倉庫(十五) —— 多重星型模式
(五)進階技術 10. 多重星型模式 從(五)進階技術1. “增加列”開始,已經通過增加列和表擴充套件了資料倉庫,在(五)進階技術5. “快照”裡增加了第二個事實表,month_end_sales_order_fact表。這之後資料倉庫模式
維度模型資料倉庫(十二) —— 多路徑和參差不齊的層次
(五)進階技術 7. 多路徑和參差不齊的層次 本篇討論多路徑層次,它是對單路徑層次的擴充套件。上一篇裡資料倉庫的月維度只有一條層次路徑,即年-季度-月這條路徑。在本篇中加一個新的級別,推廣期,並且加一個新的年-推廣期-月的層次路徑。這時月維度
維度模型資料倉庫(十四) —— 雜項維度
(五)進階技術 9. 雜項維度 本篇討論雜項維度。簡單地說,雜項維度就是一種包含的資料具有很少可能值的維度。例如銷售訂單,它可能有很多離散資料(yes-no這種型別的值),如verification_ind(如果訂單已經被稽核,值為yes)c
維度模型資料倉庫(十九) —— 維度合併
(五)進階技術 14. 維度合併 隨著資料倉庫中維度的增加,會發現有些通用的資料存在於多個維度中。例如,客戶維度的客戶郵編相關資訊、送貨郵編相關資訊和工廠維度裡都有郵編、城市和州。本篇說明如何把三個維度裡的郵編相關資訊合併到一個新的郵編維度。
維度模型資料倉庫(二) —— 維度模型基礎
從圖中可以看出,每種架構中都有資料集市。資料集市就是面向終端使用者的資料庫。資料集市通常使用維度模型來建模,並根據報表和分析的需求而優化。Kimball和Inmon架構最大的區別就是是否需要一個企業級的資料倉庫(EDW)。Inmon架構中有EDW,Kimball架構中沒有。EDW本質上就是一個
資料結構(十五)排序
排序演算法 0. 前言 本來準備自己寫,無意間看到一位大佬的博文…大家還是移步吧 推薦一套自己開發的演算法演示工具 1. 總結 排序方法 平均時間複雜度 最壞時間複雜度 額外空間複雜度 穩定性
資料結構(十五)最小生成樹
最小生成樹問題 1. 什麼是最小生成樹 是一棵樹 無迴路 |V|個頂點一定有 |V|-1 條邊 是生成樹 不唯一 包含全部頂點 |V|-1 條邊都在圖裡 邊的權值和最小
資料結構(十五)
最小生成樹問題 1. 什麼是最小生成樹 是一棵樹 無迴路 |V|個頂點一定有 |V|-1 條邊 是生成樹 不唯一 包含全部頂點 |V|-1 條邊都在圖裡 邊的權值和最小 2. 貪心演算法 什麼是 “貪”:每一步都是最好的 什麼是 “好”:權重最
python/pandas資料分析(十五)-聚合與分組運算例項
用特定於分組的值填充缺失值 用平均值去填充nan s=pd.Series(np.random.randn(6)) s[::2]=np.nan s 0 NaN 1 -0.1181
Java資料結構(十五)—— 多路查詢樹
多路查詢樹 二叉樹和B樹 二叉樹的問題分析 二叉樹操作效率高 二叉樹需要載入到記憶體,若二叉樹的節點多存在如下問題: 問題1:構建二叉樹時,需多次進行I/O操作,對與速度有影響 問題2:節點海量造成二叉樹的高度很大,會降低操作速度 多叉樹 在二叉樹中,每個節點有資料項,最多有兩個子節
雲端計算設計模式(十五)——管道和過濾器模式
雲端計算設計模式(十五)——管道和過濾器模式 分解,執行複雜處理成一系列可重複使用分立元件的一個任務。這種模式可以允許執行的處理進行部署和獨立縮放任務元素提高效能,可擴充套件性和可重用性。 背景和問題 一個應用程式可能需要執行各種關於它處理的資訊不同複雜的任務。一個簡單
設計模式(十五):職責鏈模式
優點: ① 職責鏈可簡化物件的相互連線,僅需要保持一個指向上級的路線 ② 分派職責時,有更多的靈活性,可以通過在執行時刻對該鏈進行動態的增加或修改,來增加或改變那些處理請求的那些職責。 缺點: ① 不能保證請求一定被接收。既然一個請求沒有明確的接收者,那麼
Java設計模式(十二)之結構型模式:享元模式
一、定義: 享元模式,也就是說在一個系統中如果有多個相同的物件,那麼只共享一份就可以了,不必每個都去例項化一個物件。比如說一個文本系統,每個字母定一個物件,那麼大小寫字母一共就是52個,那麼就要定義52個物件。如果有一個1M的文字,那麼字母是何其的多,如果每個字母都定義一個
Java設計模式(十六)之行為型模式:迭代子模式
一、定義: 迭代器模式,就是提供一種方法訪問一個集合物件中的各個元素,而不暴露其內部的表示。在實際的開發過程中,我們可能需要針對不同的需求,可能需要以不同的方式來遍歷整個整合物件,但是我們不希望在聚合物件的抽象介面層中充斥著各種不同的遍歷操作。這個時候我們就需要這樣一種東西
輕量ORM-SqlRepoEx (十五)最佳實踐之資料對映(Map)
簡介:SqlRepoEx是 .Net平臺下相容.NET Standard 2.0人一個輕型的ORM。解決了Lambda轉Sql語句這一難題,SqlRepoEx使用的是Lambda表示式,所以,對c#程式設計師來說,是非常簡單的,其語法特點與Linq to Sql極為相似。不僅實現了完整的Select
大資料(十五):Hadoop資料壓縮與壓縮/解壓縮例項
一、資料壓縮 1.概論 壓縮技術能夠有效減少低層儲存系統(HDFS)讀寫位元組。壓縮提高了網路頻寬和磁碟空間的效率。在Hadoop下,尤其是資料規模很大和工作負載密集的情況下。使用資料壓縮閒的非常重要。在這種情況下,I/O操作
Python資料處理之(十 五)Pandas 合併concat
一、要點 pandas處理多組資料的時候往往會要用到資料的合併處理,使用 concat是一種基本的合併方式.而且concat中有很多引數可以調整,合併成你想要的資料形式. 二、axis(合併方向) axis=0是預設值,因此未設定任何引數時,函式預設axis=0。 >
Go語言基礎(十五)—— Go語言實現json資料檔案讀取與儲存
案例: package main import ( "os" "fmt" "encoding/json" "time" ) type Person2 struct { Name string Age int Sex string Hobby []string } fun
大資料WEB階段(十五)JavaEE三大核心技術之過濾器
Filter過濾器 一、Filter 過濾器概述 Filter是JavaEE三大核心技術(Servlet 、 Filter 、 Listener)之一 FIlter作用是攔截對資源的訪問 , 攔截下來後可以控制是否允許通過 , 或者在允許通過前後做
MYSQL學習筆記(十五)資料插入
插入完整的行 INSERT INTO Customers(cust_id, cust_name, cust_address, cust_city, cust_state, cust_zip