什么是數(shù)據(jù)漂移
通常我們把從源系統(tǒng)同步進(jìn)入數(shù)倉的第一層數(shù)據(jù)稱為 ODS或者staging層數(shù)據(jù),接入層 。
數(shù)據(jù)漂移是接入層數(shù)據(jù)的一個(gè)頑疾。
數(shù)據(jù)漂移定義:接入層表同一個(gè)業(yè)務(wù)日期數(shù)據(jù)中包含前一天或者后一天凌晨附近的數(shù)據(jù)或者丟失當(dāng)天的變更數(shù)據(jù)。
數(shù)據(jù)漂移出現(xiàn)的原因
一般數(shù)倉的接入層都需要存儲(chǔ)歷史數(shù)據(jù),按照一定時(shí)間段來切分進(jìn)行分區(qū)存儲(chǔ),一般選擇某個(gè)時(shí)間戳字段進(jìn)行切分。而這些時(shí)間戳字段的準(zhǔn)確性是導(dǎo)致數(shù)據(jù)漂移的根本原因。
通常,時(shí)間戳字段分為四類:
- modified_time:數(shù)據(jù)庫記錄某條數(shù)據(jù)更新的時(shí)間。
- log_time:數(shù)據(jù)庫日志記錄某條數(shù)據(jù)更新的時(shí)間。
- proc_time:具體業(yè)務(wù)過程發(fā)生時(shí)間。
- extract_time:數(shù)據(jù)記錄被抽取時(shí)間。
假設(shè)接入層將每日接入的數(shù)據(jù)存儲(chǔ)到一個(gè)分區(qū):
- 同一條記錄的數(shù)據(jù)抽取時(shí)間extract_time明顯是晚于另外三個(gè)時(shí)間的,如果用這個(gè)字段切分,ODS某個(gè)分區(qū)中的數(shù)據(jù)會(huì)包含前一天末尾的數(shù)據(jù),并丟失當(dāng)天末尾的數(shù)據(jù)。
- 如果用數(shù)據(jù)庫記錄的更新時(shí)間modified_time,前臺業(yè)務(wù)系統(tǒng)手工訂正數(shù)據(jù)時(shí)可能會(huì)遺忘同步更新該時(shí)間,導(dǎo)致該抽取的數(shù)據(jù)被遺漏掉。
- 另外,由于網(wǎng)絡(luò)或者系統(tǒng)壓力問題,log_time或者modified_time可能會(huì)晚于proc_time,導(dǎo)致數(shù)據(jù)漂移。
- 如果我們直接使用proc_time時(shí)間進(jìn)行切分,這種情況僅僅對包含一個(gè)業(yè)務(wù)過程的ODS表有效果,如果該表每條記錄需要存儲(chǔ)多個(gè)業(yè)務(wù)過程,則用proc_time切分會(huì)丟失其他發(fā)生在當(dāng)天的業(yè)務(wù)過程記錄。
以上就是出現(xiàn)數(shù)據(jù)漂移的主要原因。
處理數(shù)據(jù)漂移的方式
常用的方式是將ODS每個(gè)時(shí)間分區(qū)中向前、向后多冗余一些數(shù)據(jù),保障數(shù)據(jù)只會(huì)多不會(huì)少,具體數(shù)據(jù)切分時(shí)讓數(shù)倉接入層的下一層按照具體的業(yè)務(wù)場景用不同的業(yè)務(wù)時(shí)間proc_time來限制。