【问题标题】:I got error using MapReduce in MongoDB在 MongoDB 中使用 MapReduce 时出错
【发布时间】:2014-09-11 01:53:37
【问题描述】:

首先,我使用 OS windows XP 32 位,MongoDB 作为 NoSQL DB,Eclipse 作为编辑器程序。我从学校接到了一个关于 MapReduce 的作业,所以我决定使用 mapreduce 找出有多少工作年龄和非工作人口。我使用此代码输入数据并保存为 Insert.java :

package mongox;

 import com.mongodb.BasicDBObject;
 import com.mongodb.Mongo;
 import com.mongodb.DB;
 import com.mongodb.DBCollection;

 public class Insert {
   public static void main(String[] args) { 
    try{ 
         Mongo mongox = new Mongo(); 
         DB db = mongox.getDB("DBPublic"); 
         DBCollection koleksi = db.getCollection("lancestorvalley"); 
         BasicDBObject object = new BasicDBObject(); 

         object = new BasicDBObject(); 
         object.put("NIK", "7586930211");
         object.put("Name", "Richard Bou");
         object.put("Sex", "M");
         object.put("Age", "31");
         object.put("Blood", "A");
         object.put("Status", "Married");
         object.put("Education", "Bachelor degree");
         object.put("Employment", "Labor");
         koleksi.insert(object);
    } 
    catch(Exception e){ 
         System.out.println(e.toString());
    } 
 } 
}

我将此代码用于 MapReduce 并保存为 Mapreduce.java :

   package mongox;

    import com.mongodb.DB;
    import com.mongodb.DBCollection;
    import com.mongodb.DBObject;
    import com.mongodb.MapReduceCommand;
    import com.mongodb.MapReduceOutput;
    import com.mongodb.Mongo;

    public class Mapreduce {
    public static void main(String[] args) { 
    try{ 
         Mongo mongox = new Mongo("localhost", 27017); 
         DB db = mongox.getDB("DBPublic"); 
         DBCollection koleksi = db.getCollection("lancestorvalley"); 

         String map = "function() { "+
         "var category; " + 
         "if ( this.Age >= 15 && this.Age <=59 ) "+ 
         "category = 'Working-Age Population'; " +
         "else " +
         "category = 'Non-Working-Age Population'; "+ 
         "emit(category, {Nama: this.Nama});}";

         String reduce = "function(key, values) { " +
         "var sum = 0; " +
         "values.forEach(function(doc) { " +
         "sum += 1; "+ 
         "}); " +
         "return {data: sum};} ";

         MapReduceCommand cmd = new MapReduceCommand(koleksi, map, reduce,
                 null, MapReduceCommand.OutputType.INLINE, null);
         MapReduceOutput out = koleksi.mapReduce(cmd);   

         for (DBObject o : out.results()) {
             System.out.println(o.toString());
             }
    } 
    catch(Exception e){ 
        e.printStackTrace();; 
    }
    }
  }

我已经输入了 5000 个数据,当我运行 Mapreduce.java 时,输出是:

  { "_id" : "Non-Working-age population" , "value" : { "data" : 41.0}}
  { "_id" : "Working-age Population" , "value" : { "data" : 60.0}}

我在 Mapreduce.java 中的代码有问题吗?为什么输出只有这样,而数据大约是 5000? 希望有人可以帮助我,谢谢大家

【问题讨论】:

  • 这最好通过聚合来完成。查看reduce function requirements。 Map/reduce 可能在同一个键上多次运行 reduce 函数,并期望值的数组。

标签: java eclipse mongodb mapreduce nosql


【解决方案1】:

MongoDB 文档明确指出以下内容,这可能是导致意外行为的原因:

Platform Support

Starting in version 2.2, MongoDB does not support Windows XP. Please use a more recent version of Windows to use more recent releases of MongoDB.

此外:

MongoDB for Windows 32-bit runs on any 32-bit version of Windows newer than Windows XP. 32-bit versions of MongoDB are only intended for older systems and for use in testing and development systems. 32-bit versions of MongoDB only support databases smaller than 2GB.

【讨论】:

  • 我在 windows 7 上试过(相同的代码和 5000 个数据),输出也出错了(和 windows XP 一样):(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-03
  • 2012-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-17
相关资源
最近更新 更多