我正在尝试使用mongo hadoop(https://github.com/mongodb/mongo-hadoop)库对mongo集合进行一些集合操作。我使用mongo.input.query配置输入我的查询,该配置作为输入发送到newApiHadoopRDD。
Configuration mongodbConfig = new Configuration();
mongodbConfig.set("mongo.job.input.format","com.mongodb.hadoop.MongoInputFormat";
mongodbConfig.set("mongo.input.uri","mongodb://"+mongodbHost+"/"+database.collection);
mongodbConfig.set("mongo.input.query",query);
JavaPairRDD audienceRDD = sc.newAPIHadoopRDD(mongodbConfig, MongoInputFormat.class,Object.class, BSONObject.class);
audienceRDD.foreach(e -> System.out.println("data: "+e.toString()));
query={ "aggregate" : "__collection__" , "pipeline" : [
{ "$match" : { "date" : { "$gte" : { "$date" : "2016-08-09T00:00:00.000Z"} , "$lte" : { "$date" : "2016-08-11T00:00:00.000Z"}}}} ,
{ "$unwind" : "$segments"} ,
{ "$group" : { "_id" : "$segments" , "audienceSize" : { "$sum" : "$count"}}}]}, sort={ }, fields={ }, limit=0, notimeout=false}
如果我使用像find这样的普通查询,操作就会成功。但是当我尝试使用groupBy时,我会在RDD上获取任何记录。有人建议使用mongo hadoop连接器对mongo集合进行聚合操作。
答案 0 :(得分:1)
无论如何,由于运行聚合查询的16 MB限制,我最终创建了一个包含记录的temporaryCollection,然后对该临时集合进行查询。在RDD上存储了响应,一旦我完成了我想做的事情,我删除了临时集合。
那就是说我认为使用mongo.input.query添加使用聚合查询的能力将是这个漂亮的连接器库的一个很好的补充。