国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
兩種檢查數(shù)據(jù)重復性的方法

 http://liuzhiqiangruc.iteye.com/blog/1164201

2011

我們在ETL測試過程中經(jīng)常甚至是必須要檢測某一批數(shù)據(jù)中的某些維度在表范圍內(nèi)是否重復。

 

本文就介紹兩種檢測數(shù)據(jù)重復的簡單方法。

 

方法1:

SQL法

如果這些數(shù)據(jù)在數(shù)據(jù)庫中,那完全簡單而且OK。具體方法為:

 

Sql代碼  
  1. select (sum(c)-count(c)) uniq  
  2. from (  
  3.     select count(1) c  
  4.     from   table_t  
  5.     group by col1,col2,....coln  
  6. ) a  

 如果結(jié)果為0,則說明對應的維度上滿足唯一性要求。

 

方法2:

Linux命令法

有時候,我們得到一個體積較大的數(shù)據(jù)文件(從數(shù)據(jù)倉庫導出做別用),想要檢查這個文件中的某些個字段維度上是否滿足唯一性要求。當然,我們可以將這個文件導回到數(shù)據(jù)庫,然后再寫上面的SQL語句搞定。但是這樣做難免小題大作了。因為,我們的需求很簡單,而且由于數(shù)據(jù)文件較大,搞到數(shù)據(jù)庫里對存儲、計算、資源維護都是一種浪費。

 

現(xiàn)在分量中情況處理:

(1)數(shù)據(jù)待檢查維度上有序:

我們可以通過如下命令來解決這個問題:

 

Shell代碼  
  1. cut -d "[分隔符]" -f [你需要的維度] [你的數(shù)據(jù)文件] | uniq -c | grep -v -e '^ \+1 ' | wc -l  

 

上面的方法,采用最粗暴的遍歷文件方法搞定,同樣也是最簡單的,比其導入數(shù)據(jù)庫,分配額外存儲空間,建立索引,SQL查詢計算等來講簡直是太簡單了。

 

而且單從SQL與linux command執(zhí)行效率來講,SQL中的group by效率不見得比Linux command高。

 

如果我們需要統(tǒng)計所有維度上有無重復數(shù)據(jù),則更簡便,方法為:

 

 

Shell代碼  
  1. uniq -c [你的數(shù)據(jù)文件] | grep -v -e '^ \+1 ' | wc -l  

 

一個實際示例:

一個千萬級的數(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 文件如下:

 

 

Shell代碼  
  1. BEGIN{  
  2. }  
  3. {  
  4.     if($0 in count){  
  5.         count[$0]+=1;  
  6.     }  
  7.     else{  
  8.         count[$0] =1;  
  9.     }  
  10. }  
  11. END{  
  12.     for(x in count){  
  13.         print count[x]:"x";  
  14.     }  
  15. }  

 

此時,借助count.awk的功能,實現(xiàn)方案為:

 

 

Shell代碼  
  1. grep -v -e '^$' [你的文件] | cut -d "[分隔符]" -f [維度] | awk -f count.awk | grep -v -e '^1:' | wc -l  

 

首先去除空行,然后選取需要檢查的維度,傳入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] 部分就可以不用了。

 

本站僅提供存儲服務,所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
你需要熟練運用的12個命令行工具
linux工作筆記
高逼格|shell一出手,分析服務器日志不用愁!
Shell高效工作指南
開發(fā)人員行走Unix的隨身四藝
Linux命令技巧
更多類似文章 >>
生活服務
分享 收藏 導長圖 關注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服