2012-06-13 4 views
18

Vì vậy, tôi mới với MongoDB và MapReduce nói chung và tình cờ gặp này "đứa" (hoặc ít nhất trong tâm trí tôi một điều không minh bạch)MongoDB MapReduce - Phát ra một/một giá trị quan trọng doesnt gọi giảm

Nói rằng tôi có các đối tượng trong bộ sưu tập của tôi như vậy:

{ 'chìa khóa': 5, 'giá trị': 5}

{ 'chìa khóa': 5, 'giá trị': 4}

{ 'chìa khóa' : 5, 'value': 1}

{ 'chìa khóa': 4, 'giá trị': 6}

{ 'chìa khóa': 4, 'giá trị': 4}

{ 'chìa khóa': 3, 'giá trị': 0}

My đồ chức năng đơn giản là phát ra chìa khóa và giá trị

My giảm chức năng đơn giản là bổ sung thêm các giá trị trước khi trở về họ cho biết thêm 1 (tôi đã làm điều này để kiểm tra xem chức năng giảm là e ven gọi)

kết quả của tôi theo:

{ '_id': 3, 'giá trị': 0}

{ '_id': 4, 'giá trị': 11.0}

{ '_id': 5, 'giá trị': 11.0}

Như bạn thấy, đối với các phím 4 & 5 tôi nhận được câu trả lời dự kiến ​​của 11 NHƯNG cho th e key 3 (chỉ có một mục trong bộ sưu tập với khóa đó) tôi nhận được số 0 bất ngờ!

Hành vi tự nhiên của mapreduce này có nói chung không? Đối với MongoDB? Đối với pymongo (mà tôi đang sử dụng)?

Trả lời

34

Hàm reduce kết hợp tài liệu với cùng một khóa vào một tài liệu. Nếu chức năng bản đồ phát ra một tài liệu duy nhất cho một khóa cụ thể (như trường hợp có khóa 3), hàm reduce sẽ không được gọi.

+9

Chỉ cần rõ ràng, đây là cách giảm bản đồ được thiết kế. Nếu bạn muốn sửa đổi tài liệu bằng các khóa duy nhất (như khóa 3), hãy xem xét sử dụng chức năng hoàn thành: http://www.mongodb.org/display/DOCS/MapReduce#MapReduce-FinalizeFunction – Jenna

+3

giải pháp nếu chúng tôi muốn bao gồm quan trọng với một tài liệu trong kết quả ??? –

+1

@RaviKhakhkhar các tài liệu duy nhất vẫn được bao gồm trong các kết quả, chỉ cần các chức năng giảm không bao giờ được gọi vào chúng – Cilvic

0

Hành vi tự nhiên của mapreduce này có nói chung không?

Có.

+9

Không - điều này không phải là tự nhiên đối với "MR nói chung". Cả giấy MR gốc lẫn bản đồ Hadoop đều không làm điều này. Bạn có thể muốn chuyển đổi "1" này sang loại khác trong bộ giảm tốc, phải không? Vì vậy, nói chung bỏ qua các reducer sẽ là một ý tưởng khá xấu/lạ ;-) Điều này không có nghĩa là mongo MR không làm điều đó - nhưng nó không phải là "hành vi dự kiến ​​_in general_". –

+0

Ở đây http://docs.mongodb.org/manual/tutorial/troubleshoot-reduce-function/ Mongo nói rằng việc rút lại phải trả về giá trị của cùng một loại bản đồ. Tuy nhiên, tôi đồng ý nó xấu, quirk, bất ngờ và không rõ ràng. – amorfis

4

Tôi nhận ra đây là một câu hỏi cũ, nhưng tôi đã đến đó và cảm thấy như mình vẫn không hiểu tại sao hành vi này tồn tại và làm thế nào để xây dựng bản đồ/giảm chức năng để đó là một vấn đề không.

Lý do MongoDB không gọi hàm reduce nếu có một cá thể của khóa là vì nó không cần thiết (tôi hy vọng điều này sẽ có ý nghĩa hơn trong giây lát). Sau đây là requirements for reduce functions:

  • sự giảm chức năng phải trả lại một đối tượng có loại phải giống hệt với loại giá trị phát ra bởi các chức năng bản đồ.
  • Thứ tự của các phần tử trong các giá trịArray không được ảnh hưởng đến đầu ra của hàm reduce
  • Hàm reduce phải là không đáng kể.

Yêu cầu đầu tiên là rất quan trọng và có vẻ như một số người đang nhìn nó bởi vì tôi đã nhìn thấy một số bản đồ người trong giảm chức năng sau đó đối phó với các trường hợp đơn-key trong hàm Finalize . Tuy nhiên, đây là cách sai để giải quyết vấn đề.

Hãy suy nghĩ về nó như thế này: Nếu chỉ có một trường hợp duy nhất của một khóa, tối ưu hóa đơn giản là bỏ qua trình giảm tốc hoàn toàn (không có gì để giảm). Các giá trị khóa đơn vẫn được bao gồm trong đầu ra, nhưng mục đích của trình giảm tốc là xây dựng một kết quả tổng hợp của các tài liệu đa khóa trong bộ sưu tập của bạn. Nếu trình ánh xạ và bộ giảm tốc xuất ra cùng loại, bạn sẽ không được biết rõ ràng bằng cách xem cấu trúc đối tượng của đầu ra từ các chức năng bản đồ/giảm của bạn. Bạn không cần phải sử dụng hàm finalize để sửa cấu trúc của các đối tượng không chạy qua bộ giảm tốc.

Tóm lại, hãy lập bản đồ của bạn trong chức năng bản đồ và giảm các giá trị đa khóa thành một kết quả tổng hợp duy nhất trong các chức năng giảm của bạn.

3

Giải pháp:

  • thêm lĩnh vực mới trong đồ: duy nhất: 0
  • trong giảm thay đổi lĩnh vực này để: duy nhất: 1
  • trong hoàn làm kiểm tra này và thực hiện các hành động bắt buộc

    $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; 
    };");