簡體   English   中英

MongoDB的還原階段未按預期工作

[英]MongoDB's reduce-phase is not working as expected

我在MongoDB中使用過針對mapReduce-Programming的Java教程,最后得到了以下代碼:

package mapReduceExample;

import com.mongodb.BasicDBObject;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.DBObject;
import com.mongodb.MapReduceCommand;
import com.mongodb.MapReduceOutput;
import com.mongodb.Mongo;

public class MapReduceExampleMain {

    /**
     * @param args
     */
    public static void main(String[] args) {

        Mongo mongo;

        try {
            mongo = new Mongo("localhost", 27017);
            DB db = mongo.getDB("library");

            DBCollection books = db.getCollection("books");

            BasicDBObject book = new BasicDBObject();
            book.put("name", "Understanding JAVA");
            book.put("pages", 100);
            books.insert(book);

            book = new BasicDBObject();
            book.put("name", "Understanding JSON");
            book.put("pages", 200);
            books.insert(book);

            book = new BasicDBObject();
            book.put("name", "Understanding XML");
            book.put("pages", 300);
            books.insert(book);

            book = new BasicDBObject();
            book.put("name", "Understanding Web Services");
            book.put("pages", 400);
            books.insert(book);

            book = new BasicDBObject();
            book.put("name", "Understanding Axis2");
            book.put("pages", 150);
            books.insert(book);

            String map = "function()"
                    + "{ "
                        + "var category; "
                        + "if ( this.pages > 100 ) category = 'Big Books'; "
                        + "else category = 'Small Books'; "
                        + "emit(category, {name: this.name});"
                    + "}";

            String reduce = "function(key, values)"
                    + "{"
                        + "return {books: values.length};"
                    + "} ";

            MapReduceCommand cmd = new MapReduceCommand(books, map, reduce,
                    null, MapReduceCommand.OutputType.INLINE, null);

            MapReduceOutput out = books.mapReduce(cmd);

            for (DBObject o : out.results()) {
                System.out.println(o.toString());
            }

            //aufräumen
            db.dropDatabase();

        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }



    }
}

這是一個非常簡單的reduce-Phase,但它不是我想要的:(

輸出為:

{ "_id" : "Big Books" , "value" : { "books" : 4.0}}
{ "_id" : "Small Books" , "value" : { "name" : "Understanding JAVA"}}

我希望這樣:

{ "_id" : "Big Books" , "value" : { "books" : 4.0}}
{ "_id" : "Small Books" , "value" : { "books" : 1.0}}

為什么在一本小書的情況下,reduce-Phase不返回values.length?

問候安德烈

因為如果只有一個結果,則減少將永遠不會執行。 將其更改為finalize函數或其他功能。

對mapReduce工作原理的基本了解


讓我們介紹一下mapReduce的概念

  • 映射器 -這是發出要饋送到reduce階段的數據的階段。 它需要一個密鑰和一個要發送的 如果需要在映射器中,可以發射多次,但要求保持不變。

  • reducer-當給定鍵的一個以上值來處理該鍵已發出的值的列表時,調用reducer。


就是說,由於映射器僅發出一個鍵值,因此未調用您的reducer

您可以在finalize中清理它,但是從映射器直接發出的行為是標准設計的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM