2013-04-27 1 views
0

나는 맵리 듀스 기능을 시험하고있어하지만 예기치 않은 동작이 있습니다예기치 않은 행동

나는 사이클이 간단한와 내 컬렉션을 채워 :

for (i=0; i<10000; i++) {db.coll.insert({'a':1,'b':2})} 

그래서 나는 같은과 문서를 계산합니다 'A'값이 (이 테스트 :-)이다) 내지도 기능이

map = "function() { emit(this.a,this.b);}" 

줄일 것은입니다 :

db.coll.mapReduce 호출
reduce = "function (key,values) {return values.length;}" 

617,451,515,(지도 감소를, {{인라인 : 밖으로 1}})

예상 값이 같은 'A', 괜찮아요 10000 개 문서입니까?

그러나 결과는 다음과 같습니다

db.coll.mapReduce(map, reduce, {out:{inline:1}}) 
{ 
    "results" : [ 
      { 
        "_id" : 1, 
        "value" : 101 
      } 
    ], 
    "timeMillis" : 892, 
    "counts" : { 
      "input" : 10000, 
      "emit" : 10000, 
      "reduce" : 100, 
      "output" : 1 
    }, 
    "ok" : 1, 
} 

경우 문제가 ??? 가치가 101 인 이유는 무엇입니까? 결과에서 감산의 의미는 무엇입니까? 도와주세요! 미리 감사드립니다 !!!

답변

0

reduce 함수가 실제로 어떤 축소 작업도 수행하지 않기 때문에이 결과가 매우 기대됩니다.

기본지도 - 축소 예제 HERE을 살펴보고 reduce 함수가 실제로 수행중인 작업을 살펴보십시오. 어떻게 든 각 고유 키의 값을 결합합니다. 당신의 reduce 함수는 그렇게하지 않습니다.

+0

왜 101을 얻었는지 분명하지는 않지만 reduce 함수는 모든 값의 거대한 배열을 가진 각 키에 대해 단 한 번만 호출되지는 않지만 값은 그룹화 된 다음 여러 번 호출 될 수 있습니다 새로운 값 배열을 사용하여 이미 감소 된 값을 다시 줄이려면 - 100의 배치는 마지막 호출에서 값 배열의 길이를 101로 만듭니다. –

관련 문제