2014-09-11 91 views
0

首先我使用Windows XP 32位操作系统,MongoDB作为NoSQL DB和Eclipse作为编辑器程序。我从我的学校得到了关于MapReduce的任务,因此我决定使用mapreduce查找多少工作年龄和非工作人口。我用这个代码来输入数据,并保存为Insert.java:我在MongoDB中使用MapReduce时遇到了错误

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? 希望有人能帮助我,谢谢面前的家伙

+0

这会更好用聚合完成。查看[reduce function requirements](http://docs.mongodb.org/manual/reference/command/mapReduce/#mapreduce-reduce-cmd)。 Map/reduce可以在同一个键上多次运行reduce函数,并且需要一个数组作为值。 – wdberkeley 2014-09-15 15:49:00

回答

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. 
+0

我试过在Windows 7(相同的代码和5000数据),并且输出也出错(与Windows XP相同):( – 2014-09-12 12:15:36

相关问题