맵리듀스
맵리듀스가 이런거였다니 허망하기 짝이 없다.
(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());
}
}