數(shù)據(jù)漂移問(wèn)題出現(xiàn)的背景
我們通常構(gòu)建數(shù)倉(cāng)的ODS層時(shí)混蔼,會(huì)考慮按照某個(gè)時(shí)間戳將數(shù)據(jù)切分后分區(qū)存儲(chǔ)榨了。
ODS表中常出現(xiàn)的時(shí)間戳分為四個(gè)類型:
- 源表中標(biāo)識(shí)數(shù)據(jù)記錄更新的時(shí)間戳字段眶蕉,modified_time勋乾。
- 源表中標(biāo)識(shí)源庫(kù)日志記錄更新的時(shí)間戳字段执泰,log_time枕磁。
- 源表中記錄具體業(yè)務(wù)過(guò)程發(fā)生的時(shí)間戳字段,proc_time坦胶。
- 標(biāo)識(shí)數(shù)據(jù)從源表抽取到數(shù)倉(cāng)的時(shí)間戳字段透典,extract_time。
理想情況下顿苇,上述幾類時(shí)間戳記錄的時(shí)間一致峭咒,這樣無(wú)論使用哪個(gè)時(shí)間戳作為ODS表分區(qū)的依據(jù),同一調(diào)度周期內(nèi)的業(yè)務(wù)發(fā)生時(shí)間都位于同一個(gè)分區(qū)纪岁,不存在數(shù)據(jù)漂移凑队。
但是,生產(chǎn)上通常會(huì)出現(xiàn)如下問(wèn)題幔翰,這個(gè)問(wèn)題可能導(dǎo)致這幾類時(shí)間不一致:
- 數(shù)據(jù)抽取需要時(shí)間漩氨,所以extract_time往往晚于其他三個(gè)時(shí)間。
- 前臺(tái)業(yè)務(wù)系統(tǒng)手工修改數(shù)據(jù)時(shí)遗增,并沒(méi)有同步更新modified_time叫惊。
- 由于應(yīng)用系統(tǒng)的壓力,導(dǎo)致modified_time和log_time晚于proc_time做修。
這樣霍狰,我們?cè)贠DS中使用各種時(shí)間戳切分?jǐn)?shù)據(jù)時(shí)會(huì)面臨各種問(wèn)題:
為了便于分析抡草,我們假設(shè)統(tǒng)計(jì)周期是天,即ODS表每天數(shù)據(jù)存到一個(gè)分區(qū)蔗坯。
1. 如果根據(jù)extract_time切分?jǐn)?shù)據(jù)康震。
由于extract_time往往晚于proc_time,導(dǎo)致proc_time發(fā)生在某天末尾的少部分記錄對(duì)應(yīng)的extract_time會(huì)在第二天開(kāi)頭宾濒,這時(shí)如果按extract_time會(huì)導(dǎo)致當(dāng)天proc_time對(duì)應(yīng)的記錄存在當(dāng)天和第二天兩個(gè)分區(qū)中腿短。
2. 如果根據(jù)modified_time切分?jǐn)?shù)據(jù)。
可能某業(yè)務(wù)過(guò)程開(kāi)始發(fā)生在11:59:59绘梦,而業(yè)務(wù)過(guò)程結(jié)束橘忱,在數(shù)據(jù)庫(kù)生成數(shù)據(jù)的時(shí)間在第二天,也就是說(shuō)proc_time在11:59:59的記錄谚咬,對(duì)應(yīng)的modified_time記錄的時(shí)間在第二天鹦付。這時(shí)如果按照modified_time分區(qū),會(huì)導(dǎo)致proc_time在11:59:59的記錄存在第二天的分區(qū)內(nèi)择卦。
3. 根據(jù)log_time切分?jǐn)?shù)據(jù)。
由于log_time是由應(yīng)用系統(tǒng)日志程序記錄的郎嫁,當(dāng)生成環(huán)境發(fā)生網(wǎng)絡(luò)或者系統(tǒng)壓力時(shí)秉继,log_time會(huì)晚于proc_time。這時(shí)如果按照l(shuí)og_time分區(qū)泽铛,會(huì)發(fā)生和上述一樣的問(wèn)題尚辑。
4. 如果直接根據(jù)proc_time切分?jǐn)?shù)據(jù)。
如果該事實(shí)表只記錄了一個(gè)業(yè)務(wù)過(guò)程盔腔,是可行的杠茬。
但是如果事實(shí)表記錄了多個(gè)業(yè)務(wù)過(guò)程,只用某一個(gè)業(yè)務(wù)過(guò)程的proc_time做為分區(qū)時(shí)間弛随,那么當(dāng)天分區(qū)必定會(huì)遺漏其他業(yè)務(wù)過(guò)程的數(shù)據(jù)瓢喉。
如何處理數(shù)據(jù)漂移
最常用的處理方法是在ODS表每個(gè)時(shí)間分區(qū)中向前、后多冗余一些數(shù)據(jù)舀透,保障數(shù)據(jù)只多不少栓票,具體應(yīng)用的時(shí)候可以讓下游的表根據(jù)自身業(yè)務(wù)需要用不同的proc_time去做篩選處理。
當(dāng)然這種方式對(duì)累積快照事實(shí)表是有一些統(tǒng)計(jì)風(fēng)險(xiǎn)的愕够,例如一個(gè)訂單是當(dāng)天支付的走贪,但是第二天凌晨申請(qǐng)退款關(guān)閉了,那么當(dāng)這個(gè)訂單離線同步到ODS時(shí)惑芭,記錄該訂單的記錄只會(huì)保留最終的訂單狀態(tài)坠狡。那么統(tǒng)計(jì)當(dāng)天訂單數(shù)量時(shí)會(huì)出現(xiàn)錯(cuò)誤。