1. 程式人生 > >Mongodb的億萬級資料集合中提取欄位的所有不同值集合

Mongodb的億萬級資料集合中提取欄位的所有不同值集合

對於網際網路公司來說,隨著業務的不斷髮展,後臺儲存的各種資料也會越來越多,在這篇文章中,簡單講述一下自己在工作過程中遇到的一個小的統計需求工作,希望對有需要的人有所幫助。

需求:需要統計我們後臺資料庫(Mongodb)儲存了多少使用者手機號碼,資料庫集合中的每條記錄都有一個手機號碼,但是不同記錄的手機號碼可能是相同的,但是這裡的資料庫集合資料量較大,將近六七千萬記錄的級別。

也許剛開始會想到的是distinct方法,但是這個方法在處理這麼大的集合時,毋庸置疑會失敗的。下面講一種我實現的方法。

首先我們將需要統計的集合中你想要的欄位值全量匯出來,這可以通過Mongdb自帶的集合匯出工具mongoexport來實現,具體如下:

./bin/mongoexport -d Auth -c TokenCaller --csv --fields Caller -o callers_csv.dat

在上面的語句中,把Auth資料庫中TokenCaller集合裡面的Caller欄位值進行全量匯出到callers_csv.dat檔案中,通過計算匯出的檔案應該在1G左右。

接下來就需要對所有的號碼進行去重。我們知道Linux下有一個指令uniq,但是這個指令只會對相鄰的兩行就行比較並且去重,如果不相鄰,則無法實現去重,怎麼辦呢?

這時候我們需要用到下一個命令sort,使用sort來先對這個檔案裡面的所有行進行排序,這樣相同的值肯定在相鄰的位置,這樣去重就不會有什麼問題了。

於是有了下面的命令:

cat callers_csv.dat | sort | uniq > uniquecaller.txt

通過執行該命令後,我們就能在uniquecaller.txt中看到所有的不同手機號碼記錄了。

如果你的集合比億級別還大,通過上面的方式處理不成功的話,那麼你還可以將這個callers_csv.dat檔案先進行分割成小檔案,然後對這些小檔案先進行去重,將去重後的小檔案再進行匯聚成一個大檔案進行排序。