以下是資料倉庫常見算法整理,希望對你工作有所幫助,請大家點贊,輕按兩下"曉彬聊資料"關注謝謝!
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5SO3MGO0UmY1M2YykjMyEDMiJWN4gjYwQDZ3MmZilDO58CX4AzLcVDMxIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjL2M3Lc9CX6MHc0RHaiojIsJye.png)
曉彬聊資料
本公衆号主要關注:傳統關系型資料庫、國産資料庫、大資料、資料分析、BI、人工智能、PYTHON等技術開發與交流
7篇原創内容
公衆号
**一、ETL定義 **
ETL是将業務系統的資料經過抽取、清洗轉換之後加載到資料倉庫的過程,目的是将企業中的分散、零亂、标準不統一的資料整合到一起,為企業的決策提供分析依據。
二、ETL算法導圖
這8種ETL算法,其中主要分成4大類,增量累加、拉鍊算法是更符合資料倉庫曆史資料追蹤的算法,但現實中基于業務及性能考慮,往往存在全删全插、增量累全算法的資料表應用。
四、算法詳解
1、全删全插算法
用DML語句中的Delete/Insert實作邏輯,主要應用在維表、參數表、主檔表加載上,即适合源表是全量資料表,該資料表業務邏輯隻需儲存目前最新全量資料,不需跟蹤過往曆史資訊。
SQL代碼模型:
--步驟1. 清空目标表
TRUNCATE TABLE <目标表名>;
--步驟2. 全量插入
INSERT INTO <目标表名> (字段1,***)
SELECT 字段***
FROM <源表>
***JOIN <關聯資料>
WHERE ***;
2、增量累全算法
用Upsert實作邏輯,主要應用在參數表、主檔表加載上,即源表可以是增量或全量資料表,目标表始終最新最全記錄。
--步驟1. 生成加工源表 Create temp Table <臨時表> ***;
INSERT INTO <臨時表> (字段***)
WHERE ***;
-- 步驟2. 可利用Merge Into實作累全,目前也可以采用分步Delete/Insert或Update/Insert操作
Merge INTO <目标表> As T1 (字段***)
Using <臨時表> as S1
on (PK)
when Matched then
update set Colx = S1.Colx ***
when Not Matched then
INSERT (字段***) values (字段*** );
3、增量累加
用Append實作邏輯,主要應用在流水表加載上,即每日産生的流水、事件資料,追加到目标表中保留全曆史資料。流水表、快照表、統計分析表等均是通過該邏輯實作。
--步驟1.插入目标表
INSERT INTO <目标表> (字段1***)
4、全曆史拉鍊算法
拉連結清單定義:是一張至少存在PK字段、跟蹤變化的字段、開鍊日期、閉鍊日期組成的資料倉庫ETL資料表。
拉連結清單優勢:根據開鍊、閉鍊日期可以快速提取對應日期有效資料,對于跟蹤源系統非事件流水類表資料,拉鍊算法發揮越大作用,源業務系統通常每日變化資料有限,通過拉鍊加工可以大大降低每日打快照帶來的空間開銷,且不損失資料變化曆史。
全曆史拉連結清單算法實作邏輯:提取目前有效記錄-提取當日源系統最新資料-根據PK字段比對目前有效記錄與最新源表,更新目标表目前有效記錄,進行閉鍊操作-根據全字段比對最新源表與目前有效記錄,插入目标表。
--步驟1. 提取目前有效記錄
Insert into <臨時表-開鍊-pre> (不含開閉鍊字段***)
Select 不含開閉鍊字段***
From <目标表>
Where 結束日期 =date'<最大日期>';
--步驟2. 提取當日源系統最新資料
<源表臨時表-cur>
-- 步驟3 今天全部開鍊的資料,即包含今天全新插入、資料發生變化的記錄
Insert Into <臨時表-增量-ins>
From <源表臨時表-cur>
where (不含開閉鍊字段***) not in
(Select 不含開閉鍊字段***
From <臨時表-開鍊-pre>
);
-- 4 今天需要閉鍊的資料,即今天發生變化的記錄
Insert into <臨時表-增量-upd>
Select 不含開閉鍊字段***,開始時間
From <臨時表-開鍊-pre>
From <臨時表-開鍊-cur>
);
--步驟5 更新閉鍊資料,即曆史記錄閉鍊(删除-插入替代更新)
DELETE FROM <目标表>
WHERE (PK***) IN
(Select PK*** From <臨時表-增量-upd>)
AND 結束日期=date'<最大日期>';
INSERT INTO <目标表>
(不含開閉鍊字段***,開始時間,結束日期)
Select 不含開閉鍊字段***,開始時間,date'<資料日期>'
From <臨時表-增量-upd>;
-- 6 插入開鍊資料,即當日新增記錄
(不含開閉鍊字段***,開始時間,結束日期)
Select 不含開閉鍊字段***,date'<資料日期>',date'<最大日期>'
From <臨時表-增量-ins>;
5、增量拉鍊算法
算法實作邏輯是提取上日開鍊資料-PK相同變化記錄,關閉舊記錄鍊,開啟新記錄鍊-PK不同,源表存在,新增開鍊記錄。增量拉鍊,目的是追蹤資料增量變化曆史,根據PK比對新拉一條開鍊資料。
-- 步驟1. 提取目前有效記錄
--步驟2. 提取當日源系統增量記錄
-- 步驟3. 提取當日源系統新增記錄
Insert into <臨時表-增量-ins>
From <臨時表-開鍊-cur>
where (PK) not in
(select PK from <臨時表-開鍊-pre>);
--步驟4. 提取當日源系統曆史變化記錄
inner join <臨時表-開鍊-pre>
on (PK 等值)
where (變化字段 非等值);
--步驟5. 更新曆史變化記錄,關閉曆史舊鍊,開啟新鍊
update <目标表> AS T1
SET <變化字段 S1指派>,結束日期 = date'<資料日期>'
FROM <臨時表-增量-upd> AS S1
WHERE ( <PK 等值> )
AND T1.結束日期 =date'<最大日期>'
(不含開閉鍊字段***,開始時間,結束日期)
SELECT 不含開閉鍊字段***,date'<資料日期>',date'<最大日期>'
FROM <臨時表-增量-upd>;
--步驟6. 插入全新開鍊資料
(不含開閉鍊字段***,開始時間,結束日期)
FROM <臨時表-增量-ins>;
6、增删拉鍊算法
算法實作邏輯是,提取上日開鍊資料-提取源表非删除記錄-PK相同變化記錄,關閉舊記錄鍊,開啟新記錄鍊-PK比對,源表存在,新增開鍊記錄-提取源表删除記錄-PK比對,舊開鍊記錄存在,關閉舊記錄鍊。
-- 步驟1. 清理目标表
TRUNCATE TABLE <目标表>;
-- 步驟2. 全量插入
INSERT INTO <目标表> (字段***)
7、全量增删拉鍊算法
算法實作邏輯是提取上日開鍊資料-提取源表非删除記錄_PK相同變化記錄,關閉舊記錄鍊,開啟新記錄鍊-PK比對,源表存在,新增開鍊記錄-提取源表删除記錄-PK比對,舊開鍊記錄存在,關閉舊記錄鍊-PK比對,提取舊開鍊存在但源表不存在記錄,關閉舊記錄鍊;主要是利用業務字段跟蹤全量資料中包含删除的變化曆史。
8、自拉鍊算法
根據源表業務日期字段,和目标表開鍊、閉鍊日期比對,首尾相接,拉出全曆史拉鍊,主要将流水表資料轉化成拉連結清單資料。
--步驟1. 清理目标表