'맵리듀스'에 해당되는 글 1건

  1. 2015.11.20 :: mongodb mapreduce(2)
개발관련/MongoDB 2015. 11. 20. 16:40

먼저 collections를 확인해보자. 

1
2
3
4
5
6
7
show collections
 
//result
testReduce
users
 
 
cs

show collections를 하면 결과가 나온다. 앞서 만든 mapreduce에 사용한 testReduce와 데이타를 저장한 users가 존재한다. 


그럼 system.js를 만들어보자. 앞서 만들어놓은 함수들을 어딘가 복사해놓자. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
 
db.system.js.insert(
    [
        {
            _id: "map",
            value : function () {
             
              var key = {};
              key.eyeColor = this.eyeColor;
              key.gender = this.gender;
              
              var value = {};
              value.age = this.age;
              value.count = 1;
              emit(key, value);
            }
        },
        {
            _id: "reduce",
            value : function (key, values){
                var returnVal = {};
                var totalAge =0;
                var totalCount = 0;
                for( index in values){
                    totalAge += values[index].age;
                    totalCount += values[index].count;
                }
               
                return {"age":totalAge , "count" : totalCount};
                
            }
        },
        {
            _id : "finalize",
            value : function(key, values){
                return {
                    "age" : values.age,
                    "count" : values.count,
                    "avg" :  values.age/values.count
                };
            }
        }
    ]
);
 
 
 
cs

위 형태로 system.js 라는 collections에 저장하자. 이때 앞의 함수와 틀린점은 "_id"가 존재하며 여기에 앞서 사용한 변수명이 들어간다. value부분에 함수가 들어간다. 

여기까지 했으면 다시 collections를 확인해보자. 
1
2
3
4
5
6
 
system.indexes
system.js
testReduce
users
 
cs

system.js 라는 collections과 indexes라는넘이 추가되었다. 


이제 mapReduce를 하기전에 마지막으로 위에 값들을 load 를 해야한다. 


1
2
 
db.loadServerScripts();
cs


위에 구문을 쓰면 몽고 디비의 서버에 맵리듀스 함수가 로드 된것이다. 

그럼 map,reduce, finalize 라는 _id의 값은 어떻게 되있는지 확인하자 

map; reduce; finalize; 라는 명령으로 확인하면 다음과 같은 결과를 확인 할 수 있다. 

아래는 map; 의 함수를 보여주고있다. 

1
2
3
4
5
6
7
8
9
10
function __cf__13__f__anonymous_function() {
    var key = {};
    key.eyeColor = this.eyeColor;
    key.gender = this.gender;
    var value = {};
    value.age = this.age;
    value.count = 1;
    emit(key, value);
}
 
cs



이제 다시한번 mapreduce를 하는데 이번엔 out의 옵션을 좀 추가해보자. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
 
db.users.mapReduce(
    map,reduce, 
    {
        
       
        out : {
            reduce : "testReduce"
            
        },
        //map들어갈 collection 필터링 할때 
        query : {
            "index" : {
                $gte : 1000
            }
        },
        //가령 추천수가 가장 많은 사람을 쓸때 오름 차순으로 하면 제일 먼저 나오는 사람이 젤위이므로 이 사람을 빨리 가져올때 사용.
        //sort : {},
        //reduce 를 한 결과를 가공을 할때 사용. 
        finalize : finalize,
        //scope는 map, reduce, finalize 함수의 전역 변수로 사용된다. 
        //사용시는 $변수명으로 사용하면된다. 
        //scope: { "temp" : 1},
        //몽고디비는 bson 타입으로 저장을한다. 이때 속도가 좀 걸리는데 json 형태로 할것인지를 선택하는 옵션이다. 
        //그러나 json의 경우 속도는 빠르나 collection document의 제한이 걸린다. 그래서 안쓰는게 상책.
        //jsMode: <boolean>,
        //verbose: <boolean>
    }
);
 
 
cs


out의 옵션에 reduce를 주고 "testReduce" collection명을 주었다. 실행하면 결과는 testReduce로 저장될 것이다. 이제 


db.testReduce.find()로 값을 확인하자. 


아까 값에 reduce 된 값이 보일것이다. 


후 여기까지..... 

posted by 제스트
: