mapreduce mongodb用户代理

bgtovc5b  于 2021-06-03  发布在  Hadoop
关注(0)|答案(1)|浏览(362)

我在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进行计数,所以我不确定它是否可以用于其他事务。

xt0899hw

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

相关问题