2012-06-13 4 views
18

그래서 내가 일반적으로 MongoDB를하고 맵리 듀스와 새로 온 사람이 "특질"우연히 감소 전화 나던 하나의 키/하나의 값을 방출 (을 얻거나, 내 마음의 특질) MongoDB를 맵리 듀스 -

내가 개체가 말

{ '키': 5, '값'5}

{ '키'5 '값'4}

{ '키'같은 내 컬렉션에 : 5, '값': 1}

{ '키'4 '값'6}

{ '키'4 '값'4}

{ '키'3 '값이'0}

지도 기능은 단순히 키와 값을 방출

기능은 단순히 기능을 줄이면 그 1 (나는 이것이 확인 할 않았다 추가합니다 반환하기 전에 값 을 추가 감소 전자

{ '_id를': 3, '값을'0}

{ '_id를'4 '값을'11.0}

을 벤은

내 결과에 따라)라는

{ '_id'5 '값': 11.0}

당신이 볼 수 있듯이, 키 4 & 5 내가 11하지만 일에 대한 예상 답변을 얻을 e 키 3 (그 키를 가진 콜렉션에 하나의 엔트리 만 있음) 나는 예기치 않은 0을 얻는다!

일반적으로 mapreduce의 자연스러운 동작입니까? MongoDB를 위해서? pymongo (내가 사용하고있는)를 위해?

답변

34

reduce 함수는 동일한 키가있는 문서를 하나의 문서로 결합합니다. 지도 함수가 특정 키에 대한 단일 문서를 내 보낸다면 (키 3의 경우처럼) reduce 함수는 호출되지 않습니다.

+9

분명히 알 수 있듯이지도 축소가 디자인 된 방식입니다. 고유 키 (예 : 키 3)로 문서를 수정하려면 finalize 함수 사용을 고려하십시오. http://www.mongodb.org/display/DOCS/MapReduce#MapReduce-FinalizeFunction – Jenna

+3

포함하려는 솔루션 결과에 하나의 문서가있는 키 ??? –

+1

@RaviKhakhkhar 단일 문서가 여전히 결과에 포함되지만 감축 기능은 호출되지 않습니다. – Cilvic

0

일반적으로 mapreduce의 자연스러운 동작입니까?

예.

+9

아니오 - 이것은 일반적으로 "미스터"에게는 자연스러운 것이 아닙니다. 원래의 MR 용지도 Hadoop Map Reduce도이 작업을 수행하지 않습니다. 저 "1"을 감속기의 다른 유형으로 변환 할 수 있습니다. 그러므로 일반적으로 감속기를 건너 뛰는 것은 꽤 나쁘거나 이상한 생각 일 것입니다 ;-) 이것이 몽고의 MR이하지 않는다는 것을 의미하지는 않습니다 - 그러나 그것은 "일반적으로 기대되는 행동"이 아닙니다. –

+0

여기 http://docs.mongodb.org/manual/tutorial/troubleshoot-reduce-function/ 몽고 (Mongo)는 retuce가 동일한 유형 맵의 가치를 반환해야한다고 말합니다. 그러나, 나는 그것이 나쁘고, 기발하고, 예기치 않으며 불분명하다는 데 동의한다. – amorfis

4

나는이 오래된 질문 실현,하지만 난 그것에 와서 그것이 문제가 아닌, 그래서이 동작 및지도를 구축하는 방법/기능이 저하 존재 이유를 나는 아직도 이해하지 못했다 것 같은 느낌이 들었다.

키의 단일 인스턴스가있는 경우 MongoDB가 reduce 함수를 호출하지 않는 이유는 필요하지 않기 때문입니다 (잠시 후 더 이해할 수 있기를 바랍니다). requirements for reduce functions 다음 :

  • 는지도 기능에 의해 방출 된 값의 형태로 동일한 있어야 유형이 객체를 반환해야 함수를 감소시킨다.
  • valuesArray의 요소 순서는 reduce 함수의 출력에 영향을 미치지 않아야합니다.
  • reduce 함수는 멱등 원이어야합니다.

첫 번째 요구 사항은 매우 중요합니다 그리고 내가 그 마무리 기능의 단일 키 케이스를 다루는 감소 기능 사람들 매핑의 숫자를 본 적이 있기 때문에 많은 사람들이 그것을 내려다 보이는 것 같다 . 그러나 이것은 문제를 해결하는 잘못된 방법입니다.

다음과 같이 생각하십시오. 키의 인스턴스가 하나 뿐인 경우 간단한 최적화는 감속기를 완전히 건너 뛰는 것입니다 (줄이면 안됩니다). 단일 키 값은 계속 출력에 포함되지만 축소 기의 의도는 컬렉션에 다중 키 문서의 집계 결과를 작성하는 것입니다. 맵퍼와 감속기가 같은 유형을 출력하는 경우 map/reduce 함수의 출력 인의 객체 구조 을 보면 더 이상 알 수 없습니다. 감속기를 통과하지 못한 개체의 구조를 수정하는 데 finalize 함수를 사용할 필요가 없습니다.

즉, 맵 기능에서 맵핑을 수행하고 다중 키 값을 축소 기능의 단일 집계 결과로 축소하십시오.

3

솔루션 :

  • 추가 된 새로운 필드지도 에 : 하나 : 메이크업이 검사 완료 한
  • 의 : 단일 : 0

  • 에서 변경이 필드를 감소 필드를 만들고 필요한 조치를 취하십시오.

    $map = new MongoCode("function() { 
        var value = { 
         time: this.time, 
         email_id: this.email_id, 
         single: 0 
        }; 
    
        emit(this.email, value); 
    }"); 
    
    $reduce = new MongoCode("function(k, vals) { 
    
        // make some need actions here 
        return { 
         time: vals[0].time, 
         email_id: vals[0].email_id, 
         single: 1 
        }; 
    }"); 
    
    $finalize = new MongoCode("function(key, reducedVal) { 
        if (reducedVal.single == 0) { 
         reducedVal.time = 11111; 
        } 
        return reducedVal; 
    };"); 
    
관련 문제