Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MapReduce MongoDB用户代理_Mongodb_Hadoop_Mapreduce_Mongodb Java - Fatal编程技术网

MapReduce MongoDB用户代理

MapReduce MongoDB用户代理,mongodb,hadoop,mapreduce,mongodb-java,Mongodb,Hadoop,Mapreduce,Mongodb Java,我在Mongo DB中有500万个条目,如下所示: { "_id" : ObjectId("525facace4b0c1f5e78753ea"), "productId" : null, "name" : "example name", "time" : ISODate("2013-10-17T09:23:56.131Z"), "type" : "hover", "url" : "www.example.com", "userAgent"

我在Mongo DB中有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();
但是,由于数据量大(超过500万条),这需要花费很长时间


是否有一种使用map reduce实现此目的的方法?到目前为止,我只使用MapReduce进行计数,因此我不确定它是否可以用于其他事项。

我发现了一种方法,由于整个配置的原因,这种方法有点棘手

在安装Hadoop之后,我执行了以下操作:

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();
  • 创建了一个名为
    MongoUpdate
    的类,使用方法
    run
    设置所有配置(如输入和输出URI),创建作业并配置所有设置。其中有
    job.setMapperClass(MongoMapper.class)

  • 创建了
    MongoMapper
    ,其中我有一个方法
    map
    ,该方法获取一个
    BSONObject
    。这里我执行if-else条件,最后我执行:

    Text id=新文本(pValue.get(“_id”).toString(); write(id,新的bsonwriteable(pValue))

  • Main
    的主要方法只是实例化一个
    MongoUpdate
    类并运行它
    run
    方法

  • 导出包含所有库的jar,并在终端上键入:
    hadoop java nameofjar.jar