맵리듀스

맵리듀스

맵리듀스가 이런거였다니 허망하기 짝이 없다.

(1) aaa bbb ccc bbb ccc aaa bbb 로 데이터가 넘어온다면,

(2) 맵: 첫째로 (aaa,1) (bbb,1) (ccc,1) (bbb,1) (ccc,1) (aaa,1) (bbb,1) 식으로 바꾼다. 이것을 Map이라고 한다.

     ※ Map: key와 Value의 쌍으로 이루어진 자료구조

(3) 셔플: 둘째로 (aaa,1,1) (bbb,1,1,1) (ccc,1,1) 식으로 같은 것끼리 모을 수 있다.

(4) 리듀스: 마지막으로 (aaa,2) (bbb,3) (ccc,2) 로 바꿀 수 있다. 리듀스이다.

     ※ Reduce: Map을 줄여나감(Reduce). 갯수를 세거나, 밸류의 총합을 내거나, 평균을 구함.

몽고 DB 인서트

public static void main(String[] args) {
  // TODO Auto-generated method stub
  try{
   MongoClient mc=new MongoClient(“localhost”); //localhost,27017); 포트번호 27017
   DB db=mc.getDB(“test”);
   DBCollection dbc=db.getCollection(“books”);
   
   BasicDBObject book=new BasicDBObject();
   book.put(“name”, “자바의 정석”);
   book.put(“pages”, 600);
   dbc.insert(book);
   
   book=new BasicDBObject();
   book.put(“name”, “삼국지”);
   book.put(“pages”, 500);
   dbc.insert(book);
   
   book=new BasicDBObject();
   book.put(“name”, “초한지”);
   book.put(“pages”, 700);
   dbc.insert(book);
   
   book=new BasicDBObject();
   book.put(“name”, “손자병법”);
   book.put(“pages”, 2000);
   dbc.insert(book);
   
  }catch(Exception ex){
   System.out.println(ex.getMessage());
  }
 }

맵 리듀스

public static void main(String[] args) {
  // TODO Auto-generated method stub
  try{
   MongoClient mc=new MongoClient(“localhost”); //localhost,27017); 포트번호 27017
   DB db=mc.getDB(“test”);
   DBCollection dbc=db.getCollection(“books”);
   
   String map=”function(){ var category; if(this.pages>=600){category=’Big Books’;} else{category=’Small Books’;} emit(category,{name:this.name});}”;
   String reduce=”function(key,values){var sum=0; values.forEach(function(doc){sum+=1;}); return {books:sum}; }”;
   MapReduceCommand cmd=new MapReduceCommand(dbc, map, reduce, null, MapReduceCommand.OutputType.INLINE, null);
   MapReduceOutput out=dbc.mapReduce(cmd);
   
   for(DBObject o:out.results()){
    System.out.println(o.toString());
   }
  }catch(Exception ex){
   System.out.println(ex.getMessage());
  }
 }