資料倉儲實踐雜談(八) 去重

2021-10-01 16:41:38 字數 1671 閱讀 3471

[目錄]

資料重複是乙個比較麻煩的事情。從正常邏輯上來看,如果應用系統和資料卸出的程式沒問題,不應該存在這個問題。但實際情況來看,確又時有發生。一旦確定資料來源的資料會有重複的可能,就需要專門進行去重處理。

在資料量很大的情況下,去重很耗時。所以如果可以,盡量先行優化資料來源系統。

最直觀的去重可能就是先把資料載入到資料庫中,然後通過select distinct *,直接把重複的資料去掉。但一般來說這是個悲劇。這種操作如果無法在分布式體系下執行,將會非常慢。

從演算法角度,去重的處理流程包括如下兩個步驟:

先排序,需要對所有資料進行整體排序;一般整行資料會比較大,可以先計算沒一行資料的md5(此md5值可以保留,以後也有用的),然後針對md5值進行排序;

然後逐行檢查是否跟下一行相同,如果不同,下移一行;如果相同,標記出來,再看下一行是否相同,直到不同為止。

先說排序。排序演算法很簡單,這裡處理基本都是文字,按字典值排序即可。但不管哪個排序演算法,都需要把資料全部裝到記憶體裡面遍歷、比較;而我們需要處理的資料可能遠大於記憶體容量。所以,需要參考一下「外排序」的概念。

所謂「外排序」,是大檔案的排序,即待排序的記錄儲存在外儲存器上,待排序的檔案無法一次裝入記憶體,需要在記憶體和外部儲存器之間進行多次資料交換,以達到排序整個檔案的目的。處理的流程也分為兩個部分:

分割排序:把檔案分割成多個小檔案,每個小檔案應該可以被整體讀進記憶體進行排序處理,然後把每個排序後的結果回寫成單獨的檔案。

歸併,一般進行二路歸併。把兩個檔案按順序讀出來對比,小的拿出來放到緩衝區(假設按正序),然後小的檔案讀下一行,合併的結果輸出到新的檔案;兩兩歸併之後,最後得到完全排序的檔案。

對排序後的檔案進行去重就非常方便了。回頭看看,為啥要排序呢?如果不排序,拿到某行資料,要找跟它相同的,需要把所有資料都看一遍;如果是排序的檔案,只需要看下一行就行,如果相同就再看下一行。畢竟乙份資料**現重複的是很少的,一條資料重複多次的可能性更小,絕大多數都是往下看一行即可。

在這裡,用md5來排序和比較有比較大的好處。畢竟一般業務資料都很長,幾十個欄位很正常,而md5只有128位。當然,使用md5需要注意一點,md5存在碰撞概率,也就是不同的輸入可能得到同乙個md5值。因此,如果md5值不相同的,可以直接認定資料不相同;但md5值相同的話,則需要進一步比較實際資料內容。由於重複的資料比例很小,需要進一步比較的資料很少。而且計算md5,也是很方便的通過切割檔案分布並行的進行計算。

上述過程可以方便的移植到分布式體系上:

在hadoop體系下,利用mapreduce來實現就相當方便了。文字排序也是mapreduce的經典案例了。只需要定義好自己的分割器,比如每1萬條資料乙個分片。很容易就實現分布式的排序。

然後再來一次mapreduce,進行分片去重操作即可。

當然,利用mapreduce去重,還有乙個取巧的做法。根據reduce的過程特性,會自動根據key來計算輸入的value集合,把資料作為key輸出給reduce,無論這個資料出現多少次,reduce最終結果中key只能輸出一次。按次思路,做乙個map把整行資料作為key,value設為空。reduce輸出key即可。這是得益於mapreduce處理過程內部做了對key的排序。如果每行資料很大,不管哪種方式實現,都建議用md5來進行排序和比較,能進一步提高效率。

未完待續。

資料倉儲實踐雜談(十九) 資料探勘

目錄 我們經常說,資料統計是根據已有規律的進行計算得到結果,比如特定產品銷量的地區分布或時間分布,因為我們都知道銷量和地區 時間肯定是關聯的。而資料探勘則是發現未知的規律。比如傳說已久的 啤酒與尿布 的故事,就是資料探勘的乙個成功的典型範例。雖然不存在普適性,但針對沃爾瑪在當時特定的場景確實揭露了未...

資料倉儲雜談

昨天跟同事聊了下目前哪些行業資料倉儲比較領先,各個行業的資料倉儲是怎麼做的,跟網際網路比,差別是什麼東西,前期資源評估,資料庫選型怎麼搞等。有點心得,記錄如下 1,目前來看,金融,保險,通訊,網際網路,物流這幾個行業的資料倉儲做的比較領先,其中由於金融和通訊的業務模型比較穩定,清晰,所以基本上從業務...

資料倉儲實踐雜談(十六) 漸變維

目錄 漸變維也叫緩慢漸變維度。這個概念提出來,其實也就直接意味著,我們分析的角度並不是一成不變,而是會變化的。前面談增量 拉鍊的時候,更多討論 事實 資料的變化。業務每天都在發生這個是必然的。但對應的分析維度也一定會變化。比如客戶資訊,某個客戶一開始在a城市,但某時間點之後,搬家到了b城市。在跟蹤這...