Mongodb的亿万级数据集合中提取字段的所有不同值集合

来源:互联网 发布:纸模型软件 编辑:程序博客网 时间:2024/05/02 04:46

对于互联网公司来说,随着业务的不断发展,后台保存的各种数据也会越来越多,在这篇文章中,简单讲述一下自己在工作过程中遇到的一个小的统计需求工作,希望对有需要的人有所帮助。

需求:需要统计我们后台数据库(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文件先进行分割成小文件,然后对这些小文件先进行去重,将去重后的小文件再进行汇聚成一个大文件进行排序。

0 0
原创粉丝点击