如上文所說丑蛤,一個基本的數(shù)據(jù)倉庫分為貼源層,歷史層撕阎,數(shù)據(jù)模型層
本文主要來講一下貼源層(ODS)受裹,重點是如下三個方面
1.貼源層的數(shù)據(jù)清洗
2.貼源層的數(shù)據(jù)存儲
3.貼源層的數(shù)據(jù)校驗
一.數(shù)據(jù)清洗
貼源層,一般來說抽取的是源系統(tǒng)的數(shù)據(jù)闻书,是一個數(shù)據(jù)緩沖區(qū)名斟,和源系統(tǒng)保持一致,但并不是說貼源層的數(shù)據(jù)就可原來的一模一樣不變了
貼源層也要做基本的數(shù)據(jù)清洗魄眉,數(shù)據(jù)清洗時貫穿整個數(shù)據(jù)倉庫的全流程的砰盐。
貼源層的數(shù)據(jù)清洗主要包括兩方面
1.數(shù)據(jù)類型
我們一般搭建大型的數(shù)據(jù)倉庫,目前來說主要是搭建在hadoop 大數(shù)據(jù)集群上坑律,當(dāng)然以前可能也搭建oracle的數(shù)據(jù)倉庫岩梳,但我們的業(yè)務(wù)系統(tǒng)的數(shù)據(jù)則可能來自oracle,mysql晃择,sql server 等不同類型的數(shù)據(jù)庫冀值,雖然這些數(shù)據(jù)庫在大體上都遵從通用的數(shù)據(jù)類型,但也存在細(xì)微的差別宫屠,如果對數(shù)據(jù)類型不處理好列疗,就可能導(dǎo)致進(jìn)到數(shù)據(jù)倉庫的數(shù)據(jù)和源系統(tǒng)的不一樣。
? ? ? 舉一個簡單的例子浪蹂,在mysql 中的double 類型抵栈,進(jìn)入到hive 里面告材,可能有適合對double類型的支持不一定很好,這時候古劲,可能就需要改變相關(guān)的數(shù)據(jù)類型斥赋,比如用decimal 來代替,舉一個我遇到的情況产艾,0.0001 在hive里用double 類型疤剑,可能存儲的就是科學(xué)計數(shù)法的數(shù)據(jù)了,那這樣的數(shù)據(jù)類型如果不處理闷堡,到后面得到的就是錯誤的數(shù)據(jù)了隘膘。
2.明顯的差錯數(shù)據(jù)
明顯的差錯數(shù)據(jù)簡單講兩個方面的:
1>.是空數(shù)據(jù),可能源系統(tǒng)因為是事務(wù)性的杠览,在做某些操作時棘幸,存在誤操作在所難免,可能就導(dǎo)致空數(shù)據(jù)等明顯的臟數(shù)據(jù)進(jìn)到數(shù)據(jù)庫中倦零,其實空數(shù)據(jù)一般來說不影響我們的統(tǒng)計不清洗也可以误续,但有時候這樣的臟數(shù)據(jù)過多,我們也需要做一個基本的清洗
2>.是有特殊字符的錯誤數(shù)據(jù)扫茅,如果不清洗對數(shù)據(jù)導(dǎo)入數(shù)據(jù)倉庫會造成影響的蹋嵌,比如某些字段中有換行符號,如果不進(jìn)行處理葫隙,可能導(dǎo)致數(shù)據(jù)進(jìn)入數(shù)據(jù)倉庫錯位
當(dāng)然另外一種觀點貼源層栽烂,數(shù)據(jù)不做任何清洗,錯也錯的一樣恋脚。當(dāng)然也有他一定的道里腺办。
二.數(shù)據(jù)存儲
數(shù)據(jù)存儲這里指以什么樣的方式導(dǎo)入數(shù)據(jù)倉庫存儲。
通常導(dǎo)入數(shù)據(jù)的方法無非兩種糟描,1.增量切片怀喉,2.全量
這里介紹兩個選擇存儲的方法
1.數(shù)據(jù)量級,如果數(shù)據(jù)量都比較小船响,通常選擇全量導(dǎo)入躬拢,因為這樣導(dǎo)入是最安全,最簡單见间,最高效的聊闯,當(dāng)然這樣的數(shù)據(jù)進(jìn)ods容易,以后在歷史層的存儲可能能就會復(fù)雜點米诉,這里以后再講
2.如果數(shù)據(jù)量級比較大菱蔬,那這個時候我們就要考慮增量的方式了,一方面大量的數(shù)據(jù)需要耗費很多的存儲空間,另一方面在抽取數(shù)據(jù)的時候需要很多的時間拴泌。在這種情況下犹褒,對于按照時間等維度每天增量更新的數(shù)據(jù),且歷史數(shù)據(jù)不再改變的或者變化的是近期數(shù)據(jù)的弛针,我們可以選擇增量導(dǎo)入1天或者一段時間的數(shù)據(jù),保證新增的數(shù)據(jù)都進(jìn)入ODS李皇,當(dāng)然對于大數(shù)據(jù)量的有時候也會遇到比較坑的存儲數(shù)據(jù)削茁,比如源庫只對源表進(jìn)行update操作,并且update的時間字段無法使用的掉房,這樣就只能全部導(dǎo)入了茧跋。
還有一種比較特殊的情況,這里舉一個我在工作中遇到的可能一個比較經(jīng)典的情況吧:在我呆的上家公司卓囚,客戶表每天在源庫是update的瘾杭,就是有新的客戶進(jìn)來就會增一條記錄,客戶信息有變化就會改一條記錄哪亿,但是粥烁,也行是系統(tǒng)原因還是不知道什么原因,以源庫的updatetime 時間字段去增量導(dǎo)入新數(shù)據(jù)蝇棉,總會漏部分?jǐn)?shù)據(jù)讨阻,每天都這樣,開始以為updatetime 時間字段可能延遲了篡殷,就取前1個月更新的數(shù)據(jù)钝吮,最后發(fā)現(xiàn)還是會有部分更新的數(shù)據(jù)沒拿進(jìn)來,導(dǎo)致報表出錯板辽,后天想了一個辦法奇瘦,客戶的客戶號是唯一的,用客戶號大于多少劲弦,小于多少去取源數(shù)據(jù)耳标,這樣就能夠把所有的數(shù)據(jù)都拿進(jìn)來了。
3.在系統(tǒng)空間允許的情況下邑跪,一般建議拿到ODS的數(shù)據(jù)保留3個月以上麻捻,如果存儲空間比較緊張的建議最少保存7天的,在oracle中如果空間不夠呀袱,可以考慮把7天之前拿過來的數(shù)據(jù)進(jìn)行壓縮存儲贸毕。
三.數(shù)據(jù)校驗
一般來說數(shù)據(jù)貼源層的數(shù)據(jù)校驗不說說要保證貼源層的數(shù)據(jù)一定正確,而是要保證和源業(yè)務(wù)庫一致夜赵,錯也要錯得一樣明棍。所以這一層的校驗主要在1.數(shù)據(jù)條目 2.數(shù)量類字段的求和值
數(shù)據(jù)條目,這個肯定是要核對的寇僧,但每天源系統(tǒng)一般抽取的數(shù)據(jù)表會非常多摊腋,建議最好寫出自動化的腳本自動比對沸版。數(shù)量類的核對主要怕中間的數(shù)據(jù)導(dǎo)致錯誤,比如漏了一條新數(shù)據(jù)兴蒸,但是某個數(shù)據(jù)插入了兩遍等视粮,如果源表有金額字段,可以sum(金額)看下源庫和ODS庫是否相同橙凳。
這里有一點要注意的是辨萍,因為此步的核對涉及到對源庫的操作甸赃,可能不一定是所有的公司都會開發(fā)這種權(quán)限給數(shù)據(jù)倉庫,還有一點,自動化的腳本對源庫操作要適度犁罩,不能影響源庫的正常工作使用庄拇。
四 總結(jié)
其實關(guān)于ODS這一層我們感覺很簡單呈础,就把數(shù)據(jù)拿過來吧毡惜,這個過程很容易出一些低級的錯誤,一定要保持?jǐn)?shù)據(jù)敏感性瞬铸,在源頭上把好數(shù)據(jù)這一關(guān)批幌,不然后面都白搭∩そ冢看似最無用逼裆,其實最關(guān)鍵,這就是貼源層