资讯专栏INFORMATION COLUMN

Mongdb中常用的数据清洗

lbool / 2251人阅读

摘要:解决方案查询重复数据删除重复数据去除重复组的第一个元数据,得到除第一个之外的其他元组删除这些重复的数据删除重复数据版本复制里的数据到另一个中过滤重复字段并统计总记录数添加过滤条件

前言

分享一些Mongdb常用的数据清洗方式

注:"Exceeded memory limit for $group, but didn"t allow external sort. Pass allowDiskUse:true to opt in." 原因与解决:

原因

  大数据计算、数据统计时,每个计算任务(job或task)都会使用独立有限的内存空间,mongodb没有提供复杂的内存分配模型(任务调度算法),仅限定每个stage最多使用100M内存,如果超过此值将终止计算并返回error;为了支持较大数据集合的处理,我们可以指定“allowDiskUse”参数将“溢出”的数据写入本地的临时文件中(临时的collection),这个参数我们通常需要设定为true。

解决方案:

{allowDiskUse:true}
查询重复数据
db.feedImg_all.aggregate([
    {
        $group: { _id: {"mvid": "$mvid","feed_id":"$feed_id"},count: {$sum: 1},dups: {$addToSet: "$_id"}}
    },
    {
        $match: {count: {$gt: 1}}
    }
],{allowDiskUse:true})
删除重复数据
db.xiuxiu_all.aggregate([
    {
        $group: { _id: {"mvid": "$mvid","feed_id":"$feed_id"},count: {$sum: 1},dups: {$addToSet: "$_id"}}
    },
    {
        $match: {count: {$gt: 1}}
    }
],{allowDiskUse:true}).forEach(function(doc){
    doc.dups.shift();                       // 去除重复组的第一个元数据_id,得到除第一个之外的其他元组
    db.xiuxiu_all.remove({_id: {$in: doc.dups}}); // remove()删除这些重复的数据
})
删除重复数据(python版本)
# -*- coding:utf-8 -*-
import pymongo
from pymongo import DeleteOne
"""
@author: lcx
@time: 2018/11/15
@desc:

"""

pipeline = [
    {
        "$group": {
            "_id": {"mvid": "$mvid", "feed_id": "$feed_id"},
            "count": {"$sum": 1},
            "dups": {
                "$addToSet": "$_id"
            }
        },
    },
    {
        "$match": {
            "count": {
                "$gt": 1
            }
        }
    }
]

myclient = pymongo.MongoClient(host="m3005.test.com",port=3005,connect=False)
db = myclient.deepnet_test

if __name__ == "__main__":
    map_id = map(lambda doc: doc["dups"][1:], db["xiuxiu_all"].aggregate(pipeline=pipeline,allowDiskUse=True))
    list_id = [item for sublist in map_id for item in sublist]
    print(db["xiuxiu_all"]
          .bulk_write(list(map(lambda _id: DeleteOne({"_id": _id}), list_id)))
          .bulk_api_result)
复制collection里的数据到另一个collection中
db.xiuxiu_all.find().forEach(function(x){
    db.xiuxiu_all_bak.insert(x);
})
过滤重复字段并统计总记录数
db.feedImg_all.aggregate(
  [
     {$match:{"createTime": {"$gte":  1541606400, "$lt": 1541692800}}}, // 添加过滤条件
     {$project:{"feedId": true}},  
     {$group:{_id: "$feedId"}}, 
     {$group:{_id: null, count: {$sum:1}}}
 ], {allowDiskUse: true})

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/19411.html

相关文章

  • Mongdb常用数据清洗

    摘要:解决方案查询重复数据删除重复数据去除重复组的第一个元数据,得到除第一个之外的其他元组删除这些重复的数据删除重复数据版本复制里的数据到另一个中过滤重复字段并统计总记录数添加过滤条件 前言 分享一些Mongdb常用的数据清洗方式 注:Exceeded memory limit for $group, but didnt allow external sort. Pass allowDisk...

    KaltZK 评论0 收藏0
  • MongDB 数据库副本集配置

    摘要:登陆丛机此时,丛机已经在副本集群中了,进行最后一个操作这样在主机上的操作就会同步到从机上了。 本文目的 为了在各个MongDB之间实现多节点之间的数据自动备份,提高容灾性能。MongoDB复制是将数据同步在多个服务器的过程。复制提供了数据的冗余备份,并在多个服务器上存储数据副本,提高了数据的可用性,并可以保证数据的安全性。mongodb的复制至少需要两个节点。其中一个是主节点,负责处理...

    jubincn 评论0 收藏0
  • 用node.js和mongDB建立网站

    摘要:设计数据库模型数据库字段定义传入模式编译,生成构造函数文档实例化,调用模型批量查询单条数据的查询单条数据的删除数据库的正删改查,及后台开发逻辑文件目录 用node.js和mongDB建立网站 参考资料:1.jade学习https://www.jianshu.com/p/e2a...http://www.nooong.com/docs/ja...2.app.js的结构设计(作用)http...

    Little_XM 评论0 收藏0
  • 用node.js和mongDB建立网站

    摘要:设计数据库模型数据库字段定义传入模式编译,生成构造函数文档实例化,调用模型批量查询单条数据的查询单条数据的删除数据库的正删改查,及后台开发逻辑文件目录 用node.js和mongDB建立网站 参考资料:1.jade学习https://www.jianshu.com/p/e2a...http://www.nooong.com/docs/ja...2.app.js的结构设计(作用)http...

    Bmob 评论0 收藏0
  • 使用Pandas&NumPy进行数据清洗6大常用方法

    摘要:在这个教程中,我们将利用的和包来进行数据清洗。在很多情况下,使用唯一的值作为索引值识别数据字段是非常有帮助的。清洗数据字段到现在为止,我们移除了不必要的列并改变了我们的索引变得更有意义。 作者:xiaoyu微信公众号:Python数据科学知乎:Python数据分析师 数据科学家花了大量的时间清洗数据集,并将这些数据转换为他们可以处理的格式。事实上,很多数据科学家声称开始获取和清洗数据...

    siberiawolf 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<