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

Mongodb使用知识点记录 专栏收录该内容
24 篇文章 20 订阅

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

需求:需要统计我们后台数据库(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
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

打赏
文章很值,打赏犒劳作者一下
相关推荐
©️2020 CSDN 皮肤主题: 程序猿惹谁了 设计师:白松林 返回首页

打赏

DreamMakers

您的肯定是我坚持的最大动力。

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值