http://liuzhiqiangruc.iteye.com/blog/1164201
2011
我們在ETL測試過程中經(jīng)常甚至是必須要檢測某一批數(shù)據(jù)中的某些維度在表范圍內(nèi)是否重復。
本文就介紹兩種檢測數(shù)據(jù)重復的簡單方法。
方法1:
SQL法
如果這些數(shù)據(jù)在數(shù)據(jù)庫中,那完全簡單而且OK。具體方法為:
如果結(jié)果為0,則說明對應的維度上滿足唯一性要求。
方法2:
Linux命令法
有時候,我們得到一個體積較大的數(shù)據(jù)文件(從數(shù)據(jù)倉庫導出做別用),想要檢查這個文件中的某些個字段維度上是否滿足唯一性要求。當然,我們可以將這個文件導回到數(shù)據(jù)庫,然后再寫上面的SQL語句搞定。但是這樣做難免小題大作了。因為,我們的需求很簡單,而且由于數(shù)據(jù)文件較大,搞到數(shù)據(jù)庫里對存儲、計算、資源維護都是一種浪費。
現(xiàn)在分量中情況處理:
(1)數(shù)據(jù)待檢查維度上有序:
我們可以通過如下命令來解決這個問題:
上面的方法,采用最粗暴的遍歷文件方法搞定,同樣也是最簡單的,比其導入數(shù)據(jù)庫,分配額外存儲空間,建立索引,SQL查詢計算等來講簡直是太簡單了。
而且單從SQL與linux command執(zhí)行效率來講,SQL中的group by效率不見得比Linux command高。
如果我們需要統(tǒng)計所有維度上有無重復數(shù)據(jù),則更簡便,方法為:
一個實際示例:
一個千萬級的數(shù)據(jù)文件進行維度唯一性檢查時,在我的臺式機上安裝的虛擬機上(哈哈,性能夠差的)執(zhí)行大概需要10秒左右的樣子。
(2)數(shù)據(jù)待檢查維度上無序:
面對這樣的數(shù)據(jù),uniq要想發(fā)揮作用,則必須在uniq之前進行sort,而對于大數(shù)據(jù)來講sort是不可行的。
因為無論如何sort也需要nlogn的時間復雜度才能OK,而接著uniq也需要n的復雜度。而且,sort需要將全部數(shù)據(jù)讀入內(nèi)存。
由于數(shù)據(jù)無序,此時最優(yōu)的方法就是掃描一遍數(shù)據(jù)得出結(jié)果。這需要借助我們上一篇博文中介紹的awk的方法完成,不過我們不需要計算sum值。
代碼稍作修改,count.awk 文件如下:
此時,借助count.awk的功能,實現(xiàn)方案為:
首先去除空行,然后選取需要檢查的維度,傳入count.awk文件中統(tǒng)計維度上數(shù)據(jù)出現(xiàn)的次數(shù),最后計算出現(xiàn)不止一次的數(shù)據(jù)又多少個。
如果結(jié)果為0,則說明檢查維度上數(shù)據(jù)唯一,否則不唯一。
例如,一個文件為:
a,b,c
a,c,e
a,b,e
a,c,f
a,d,g
a,e,g
運行上述命令檢查前兩個維度上是否有重復,結(jié)果為:
2 --a,b和a,c分別都出現(xiàn)了兩次。
如果檢查全部維度上的唯一性,則上述命令中的 [cut] 部分就可以不用了。