我在mongo数据库中有500万个条目,如下所示:
{
"_id" : ObjectId("525facace4b0c1f5e78753ea"),
"productId" : null,
"name" : "example name",
"time" : ISODate("2013-10-17T09:23:56.131Z"),
"type" : "hover",
"url" : "www.example.com",
"userAgent" : "curl/7.24.0 (x86_64-apple-darwin12.0) libcurl/7.24.0 openssl/0.9.8r zlib/1.2.5"
}
我需要在每个条目中添加一个名为 device
它的值 desktop
或者 mobile
. 这意味着,目标将是有以下类型的条目:
{
"_id" : ObjectId("525facace4b0c1f5e78753ea"),
"productId" : null,
"device" : "desktop",
"name" : "example name",
"time" : ISODate("2013-10-17T09:23:56.131Z"),
"type" : "hover",
"url" : "www.example.com",
"userAgent" : "curl/7.24.0 (x86_64-apple-darwin12.0) libcurl/7.24.0 openssl/0.9.8r zlib/1.2.5"
}
我正在使用mongodb java驱动程序,目前我正在做以下工作:
DBObject query = new BasicDBObject();
query.put("device", new BasicDBObject("$exists", false)); //some entries already have such field
DBCursor cursor = resource.find(query);
cursor.addOption(Bytes.QUERYOPTION_NOTIMEOUT);
Iterator<DBObject> iterator = cursor.iterator();
int size = cursor.count();
然后我用一个 while(iterator.hasNext())
,使用一个巨大的正则表达式执行if-else,并根据if-else的结果执行如下操作:
BasicDBObject newDocument = new BasicDBObject("$set", new BasicDBObject().append("device", "desktop")); //of "mobile", depending on the if-else
BasicDBObject searchQuery = new BasicDBObject("_id", id);
resource.getCollection(DatabaseConfiguration.WEBSITE_STATISTICS).update(searchQuery, newDocument);
然而,由于数据量大(超过500万条条目),这需要永远的时间。
有没有办法用map reduce来实现这一点?到目前为止,我只使用mapreduce进行计数,所以我不确定它是否可以用于其他事务。
1条答案
按热度按时间xt0899hw1#
我发现了一个方法,这是一种棘手的,因为整个配置。
按照此链接安装hadoop后,我执行了以下操作:
创建了一个名为
MongoUpdate
,方法run
在这里我设置了所有的配置(比如输入和输出uri),创建了一个作业并配置了所有的设置。其中,有job.setMapperClass(MongoMapper.class)
创建MongoMapper
我的方法在哪里map
它得到了一个BSONObject
. 这里我执行if-else条件,最后我执行:text id=新文本(pvalue.get(“_id”).tostring());pcontext.write(id,new bsonwriteable(pvalue));
班级
Main
其主要方法只是示例化MongoUpdate
并运行它run
方法导出包含所有库的jar并在终端上键入:
hadoop java NameOfTheJar.jar