閱讀OLAP中緩慢變化的維度。(SCD)處理辦法
本文介紹了緩慢變化的維度,也稱為緩慢變化。SCD。這是不同的方法來處理不斷變化的數(shù)據(jù)。但是它有更多的細(xì)微差別,還有很多方法可供選擇。假如您對(duì)此感興趣,并且使用了大量的可視化,請(qǐng)堅(jiān)持下去!
本文將介紹以下內(nèi)容:
關(guān)鍵定義
SCD是什么?
為什么SCD非常重要
類型的SCD
結(jié)論
關(guān)鍵定義
請(qǐng)務(wù)必在開始之前了解一些關(guān)鍵概念:
數(shù)據(jù)倉庫
對(duì)數(shù)據(jù)存儲(chǔ)進(jìn)行分析和改進(jìn)。它的結(jié)構(gòu)通常由事實(shí)表和維度表組成。
事實(shí)表
這種表格包含了事件發(fā)生的關(guān)鍵維度。
例如,在社交媒體網(wǎng)站/應(yīng)用程序中,一個(gè)名字叫做“post"事實(shí)表可以用來捕捉與任何帖子活動(dòng)相關(guān)的數(shù)據(jù)及其所有關(guān)鍵層面。
這包括user_id、時(shí)間戳、device_id等:
維度表
“我們?cè)谑聦?shí)表上”post“這里有很多特征。如果我們想要這個(gè)表中的某個(gè)特征(例如user_id)更詳細(xì)的資料,該怎么辦?
它就是維度表的立足之地。維度表是一種包含事實(shí)數(shù)據(jù)表中更多信息的表,例如事實(shí)數(shù)據(jù)。表里的user_id列。
這個(gè)表格將包含相關(guān)用戶的輔助數(shù)據(jù),例如他們的名字、姓氏、出生日期、他們建立帳戶的時(shí)間戳、他們的手機(jī)號(hào)碼等。
這一表結(jié)構(gòu)的優(yōu)點(diǎn)是,事實(shí)表永遠(yuǎn)不會(huì)因?yàn)樘喽蛎洠侨绻枰敿?xì)的數(shù)據(jù),則不需要連接!
注:上述結(jié)構(gòu)捕獲了所謂的結(jié)構(gòu)星形架構(gòu)。對(duì)于雪花結(jié)構(gòu),我們也有子維度表。
OLAP
正如其名稱所示,在線分析處理是一種用于大規(guī)模分析的數(shù)據(jù)方法。
假如你熟悉上面的定義,你可能已經(jīng)注意到它們都是特定于OLAP的概念。因?yàn)镾CD只適用于OLAP。非OLTP。為什么呢?
在有機(jī)發(fā)光二極管(在線事務(wù)管理)中,我們優(yōu)先考慮1。無數(shù)據(jù)冗余和2。容納最新版本的數(shù)據(jù)。沒有靈活的空間,所以我們只覆蓋數(shù)據(jù)。
所以,本文將以O(shè)LAP為核心。
使用有機(jī)發(fā)光二極管,您可以選擇冗余和歷史數(shù)據(jù)。當(dāng)新數(shù)據(jù)傳輸時(shí),這為我們提供了更多的戰(zhàn)略選擇,我們將在下面的例子中看到這一點(diǎn)。
SCD是什么?
從這個(gè)角度來看,你現(xiàn)在想知道什么是維度表。
請(qǐng)記住,在文章開頭,我們所說的SCD在高層次上有:對(duì)數(shù)據(jù)進(jìn)行不同的處理方法。
如今我們有了前后的文字,更具體地說,變化緩慢的層次。(SCD)是專門處理維度表數(shù)據(jù)在不斷變化的數(shù)據(jù)的不同方法。
假定你有以下內(nèi)容user_id維度表:
注:為了簡(jiǎn)單考慮,我們已經(jīng)從前面的user_id示例中刪除了一些字段。
例如,主鍵(行唯一值)是user_id。接著,我們的數(shù)據(jù)管道將處理包含以下數(shù)據(jù)的新數(shù)據(jù):
有些新數(shù)據(jù)和現(xiàn)有數(shù)據(jù)有相同的主鍵鍵,我們注意到(user_id)。尼古拉斯·凱奇(NicholasCage)和杰克·佩拉爾塔(JakePeralta)所有手機(jī)號(hào)碼都是新的。
這是數(shù)據(jù)的不斷變化。
你可能會(huì)有一些最初的問題:
為什麼會(huì)“慢”地發(fā)生?為何不是事實(shí)表?為何尼古拉斯凱奇在這里?
咱們一個(gè)個(gè)解決這個(gè)問題。
為什么它“緩慢”發(fā)生?
修飾詞“慢”可能來自于對(duì)這些層次更新不太頻繁的期望。但是這并不是一個(gè)嚴(yán)格的規(guī)則。
為何不是事實(shí)表?
如“鍵定義“以上部分,事實(shí)數(shù)據(jù)表是由事件驅(qū)動(dòng)的。一旦發(fā)生事情,除非時(shí)間過程可能,否則是不可逆的!因此,這里的變化不適合。
比如有人發(fā)布微博故事的時(shí)候,現(xiàn)在已經(jīng)發(fā)生了,無法更改。如果用戶刪除了微博故事,那么這是一個(gè)獨(dú)立的事件,也就是事實(shí)表中的另一條線。
為什么尼古拉斯凱奇在這里?
他是個(gè)偉大的演員!在《無法承受的重量》中,我喜歡他的表演。
為什么SCD非常重要
如今你可能會(huì)想:為什么改變數(shù)據(jù)很重要?
讓我們參考前面的例子。你有一個(gè)包含一些當(dāng)前數(shù)據(jù)的數(shù)據(jù)庫,并且有一組新的數(shù)據(jù)進(jìn)入。正如我們?cè)贜icholasCage的手機(jī)號(hào)碼中看到的,其中一些與您現(xiàn)有的數(shù)據(jù)相沖突:
原始記錄和新記錄之間存在矛盾。我們應(yīng)該優(yōu)先選擇哪一個(gè)?是只保留一個(gè)記錄,還是同時(shí)保留兩個(gè)記錄?
這個(gè)定義SCD很重要。你最終會(huì)選擇一種策略來處理這種情況,根據(jù)團(tuán)隊(duì)中的業(yè)務(wù)需求和/或者最佳的數(shù)據(jù)工程實(shí)踐。
注:為了簡(jiǎn)單考慮,我們已經(jīng)從例子中刪除了user_id列。但它是幫助數(shù)據(jù)管道確定哪些層次正在發(fā)生變化的關(guān)鍵列。
類型的SCD
有哪些不同的策略,我們?nèi)绾螞Q定哪些策略?
有許多策略-7種類型。但是,由于脫離實(shí)際,有些策略從來沒有使用過,所以我們只關(guān)注本文中的幾個(gè)關(guān)鍵策略。
本論文將提供一些幫助理解的例子,并對(duì)何時(shí)使用哪一種策略提供一些指導(dǎo)。
SCD-0:無更新
表明:更新的數(shù)據(jù)已經(jīng)進(jìn)入,但是我們忽略了它,沒有做任何改變。
推理:我們有一些維度是我們預(yù)期永遠(yuǎn)不會(huì)改變的,因此這一新數(shù)據(jù)很可能是重復(fù)的,或只是有缺陷的數(shù)據(jù)。
示例:假設(shè)顧客第一次正確輸入,我們絕不希望他們的出生日期發(fā)生變化。這是不合理的,除非你偽造出生證明。
所以,如果提出任何改變,例如:
具有新生日期值的行
我們選擇忽略這些變化,保持?jǐn)?shù)據(jù)不變。
SCD-0如何處理更新?
思考:
由于很少有字段永遠(yuǎn)不會(huì)改變,我發(fā)現(xiàn)這種SCD的適用性有限。
即便對(duì)于像date_of_birth這類字段,客戶也可能在第一次出錯(cuò),所以我們需要我們的數(shù)據(jù)管道來處理這些邊緣情況。
SCD-1:覆蓋
解釋:進(jìn)入更新的數(shù)據(jù)行,然后我們完全覆蓋當(dāng)前的行程。
推理:我們的維度只關(guān)心當(dāng)前的狀態(tài),所以我們刪除了任何過時(shí)的行,然后使用更新的行。
例:尼古拉斯·凱奇(NicholasCage)和杰克·佩拉爾塔(JakePeralta)他們的數(shù)據(jù)再次更新。這次,他們更改了手機(jī)號(hào)碼。
有新手機(jī)號(hào)碼值的行行
由于我們只關(guān)心他們的手機(jī)號(hào)碼,所以我們不再需要聯(lián)系他們,user_id他們的舊聯(lián)系電話在表中使用。
SCD-如何處理更新?
思考:
這一SCD策略可以證明它是有用的,尤其是當(dāng)你試圖防止表格膨脹時(shí)。
然而,丟失數(shù)據(jù)總是有風(fēng)險(xiǎn)的,因?yàn)榕まD(zhuǎn)這個(gè)決定并恢復(fù)數(shù)據(jù)并不總是那么容易。未來需求總會(huì)發(fā)生變化,所以我會(huì)謹(jǐn)慎使用。
SCD-2:全部保留(基于行)
解釋:會(huì)有更新的數(shù)據(jù)線,所以我們會(huì)把新的線添加到表格中。我們不會(huì)刪除任何數(shù)據(jù)。為了區(qū)分兩者,我們最多有三個(gè)新列:
開始日期列-本條目的數(shù)據(jù)管道處理時(shí)間
結(jié)束日期列-這個(gè)內(nèi)容什么時(shí)候結(jié)束(如果還沒有結(jié)束,你可以選擇31-12-99999,以顯示它永遠(yuǎn)不會(huì)在我們有生之年結(jié)束)
版本號(hào)列-1表示第一個(gè)版本,然后在每次更新時(shí)增加1。
所以,維度表的結(jié)構(gòu)將按照下列策略進(jìn)行改變:
表結(jié)構(gòu)含有SCD-2。
推理:雖然我們有更新的維度,但是我們不希望在這個(gè)過程中丟失歷史數(shù)據(jù)。
示例:2024年2月2日,NicholasCage和JakePeralta(01年2024月2024日)<>日本)更新了他們的地址。
有新郵編值的行
雖然我們希望更新表格,但是我們希望保留舊的數(shù)據(jù),防止我們進(jìn)行一些歷史分析。
例如,我們可能想觀察客戶多年來的位置分布。2020年把尼古拉斯·凱奇放在他的新地址是沒有意義的,因?yàn)樗?dāng)時(shí)沒有住在那里。因此,我們保留了新舊數(shù)據(jù)和新舊數(shù)據(jù)版本、start_date和end_date列,以幫助區(qū)分兩者。
SCD-如何處理更新?
思考:
SCD-二是我首選的維度數(shù)據(jù)變更方法之一。
你用易于閱讀和解釋的方法來維護(hù)所有的數(shù)據(jù)。
即便你最后只使用最新版本或者第一個(gè)版本,也可以選擇版本或end_date輕松實(shí)現(xiàn)。
這個(gè)策略也是可以擴(kuò)展的,因?yàn)槟憧梢院苋菀椎靥幚砦磥硗粋€(gè)字段的變化:為每一個(gè)新版本添加新行。
SCD-3:全部保留(基于列)
解釋:進(jìn)入更新的數(shù)據(jù)行,然后我們使用新列進(jìn)行跟蹤。我們將其分為兩列——“當(dāng)前”列和“最后一列”,而不僅僅是為了一個(gè)層次:
表結(jié)構(gòu)含有SCD-3。
類似于SCD-2,我們不會(huì)刪除任何數(shù)據(jù)。
推理:雖然我們有更新的維度,但是我們不希望在這個(gè)過程中丟失歷史數(shù)據(jù)。
例:尼古拉斯·凱奇(NicholasCage)和杰克·佩拉爾塔(JakePeralta)更新他們的地址:
有新郵編值的行
我們所做的是:
將“current_post_code所有值都拷貝到“previous_post_code”
隨后更換“current_post_code“所有有新值的值:
SCD-如何處理更新?
思考:
假如我們期望在顧客的生活中只有一次改變,那么SCD-3是合適的。但是,這個(gè)很難保證。
一些文章討論了SCD-3的組合,這些組合包括更多的列表來顯示更多的版本。例如,使用“previous_3_post_code“列捕捉第三個(gè)最新值。
在我看來,SCD-3不能隨著數(shù)據(jù)的變化而很好地?cái)U(kuò)展,在這一點(diǎn)上,選擇SCD-2策略更有意義。
SCD-4:全部保留(歷史記錄表)
解釋:在一個(gè)維度表中,我們沒有保存所有變更的數(shù)據(jù),而是創(chuàng)建了一個(gè)額外的“迷你級(jí)別”歷史記錄表。
通過這種方式,當(dāng)更新的數(shù)據(jù)行傳輸時(shí),我們將做兩件事:
覆蓋當(dāng)前表(類似于SCD-1)
跟蹤之前的數(shù)值(類似于SCD-2)更新歷史表
這一“歷史表”包含了什么?
主鍵列-允許您回到當(dāng)前表格(簡(jiǎn)單考慮一下,下圖省略)
其它列在維度表中-由于你正在捕捉這些列的歷史價(jià)值(例如post_code)
開始日期列-本條目的數(shù)據(jù)管道處理時(shí)間
結(jié)束日期列(可選))-這個(gè)內(nèi)容什么時(shí)候結(jié)束(如果還沒有結(jié)束,你可以選擇31-12-99999,以表明它永遠(yuǎn)不會(huì)在我們的生命周期中結(jié)束)
版本號(hào)列(可選)-1表示第一個(gè)版本,然后在每次更新時(shí)增加1。
歷史表
推理:雖然我們有更新的維度,但是我們不想在這個(gè)過程中丟失歷史數(shù)據(jù)。同時(shí),我們也希望保持所有當(dāng)前數(shù)據(jù)的快照。
例:尼古拉斯·凱奇(NicholasCage)和杰克·佩拉爾塔(JakePeralta)他們的地址再次更新:
行行具有新的帖子代碼值
如解釋以上,我們對(duì)當(dāng)前和歷史表格進(jìn)行了相應(yīng)的更新:
SCD-如何處理更新(當(dāng)前表)
SCD-如何處理更新(歷史表)
思考:
SCD-四是我最喜歡的另一種方法,當(dāng)前版本與SCD-2有許多相似之處。
你現(xiàn)在可能會(huì)說:那么,我該如何在兩者之間做出決定呢?
在SCD-2和SCD-4之間進(jìn)行選擇時(shí),應(yīng)考慮兩個(gè)關(guān)鍵問題:
層次更新頻率如何?
在整篇文章中,我們的例子只介紹了一個(gè)用戶更新。我們明確表示,SCD-2比SCD-3更適合超過兩次更新。
但是,如果客戶的郵政代碼更新了多達(dá)100次怎么辦?甚至更多?如果這種情況發(fā)生在數(shù)百萬客戶身上,這在微博這樣的大平臺(tái)上是可能的?
使用SCD-2,我們可以捕捉更改,但是user_id維度表將變得愚蠢,特別是在你一開始只需要當(dāng)前的數(shù)據(jù)。
這就是SCD-4的亮點(diǎn):它為用戶提供了靈活性。如果你想實(shí)施歷史分析,它真的需要連接歷史表,所以請(qǐng)記住這一點(diǎn)。
下游分析是否一直依賴于歷史數(shù)據(jù)或當(dāng)前數(shù)據(jù)?
假如下游數(shù)據(jù)用戶經(jīng)常使用歷史郵編數(shù)據(jù),那么SCD-4就意味著他們必須在當(dāng)前表格和歷史表格之間進(jìn)行連接。
SCD-二是繞過這一步,減少查詢執(zhí)行時(shí)間和集群資源。
但是,如果專門針對(duì)當(dāng)前數(shù)據(jù)的查詢頻率相當(dāng)高,那么SCD-2就意味著客戶每次都要對(duì)其進(jìn)行過濾。
SCD-4表示用戶只需使用當(dāng)前表格,繞過此步驟,減少查詢執(zhí)行時(shí)間和集群資源。
結(jié)論
簡(jiǎn)而言之,SCD是一種不同的方法來處理維度表中的數(shù)據(jù)變更。每種方法在不同的方案中都非常有用,最終取決于你的要求。因此,請(qǐng)花時(shí)間了解您的數(shù)據(jù),然后相應(yīng)地應(yīng)用正確的SCD策略。
本文來自微信微信官方賬號(hào)“數(shù)據(jù)驅(qū)動(dòng)智能”(ID:Data作者:曉曉,36氪經(jīng)授權(quán)發(fā)布,_0101)。
本文僅代表作者觀點(diǎn),版權(quán)歸原創(chuàng)者所有,如需轉(zhuǎn)載請(qǐng)?jiān)谖闹凶⒚鱽碓醇白髡呙帧?/p>
免責(zé)聲明:本文系轉(zhuǎn)載編輯文章,僅作分享之用。如分享內(nèi)容、圖片侵犯到您的版權(quán)或非授權(quán)發(fā)布,請(qǐng)及時(shí)與我們聯(lián)系進(jìn)行審核處理或刪除,您可以發(fā)送材料至郵箱:service@tojoy.com