MongoDb中的MapReduce

MapReduce是面向大數據並行處理的計算模型。MongoDb中提供了MapReduce的聚合工具,來實現任意複雜的邏輯,很強大,很靈活。它的計算理念是:將一個大問題拆分紅若干個小問題,將各個小問題發送到不一樣的機器上進行計算。在各個小問題解決完時,再將這些小問題的結果合併爲一個最終的結果。java

從設計理念能夠看出,MapReduce操做有2個階段:第一個階段是Map(映射)階段,第二個階段是Reduce(化簡)階段。能夠參考官網的一個demo:數組

MapReuce語句 MapReuce流程圖

  1. 先查找符合條件的數據:查找出order集合中全部status爲A的記錄。
  2. 而後執行Map(映射):根據order集合記錄中cust_id字段爲key,amount爲value進行規約。全部相同的key的全部value,組成一個數組,傳給後面的reduce。
  3. 最後進行Reduce(化簡):是把由map傳回來的key/value的value進行求和,獲得最終以每一個用戶(cust_id)爲key,全部金額求和的值爲value的結果。最終結果out在臨時表「order_totals」中。

附上我用java寫的一段MapReduce代碼:數據結構

/**
     * 查詢訂單表中的積分
     *
     * @return 積分數
     */
    public int selectOrderInfoScore(Query query) {
        String mapStr = "function() { emit(this.pay_type, { \"score\": this.score }) }";
        String reduce = "function(key, values) {\n" +
                "            var scores = 0;\n" +
                "            for (var i in values) {\n" +
                "                scores += values[i].score;\n" +
                "            }\n" +
                "            return { \"score\": scores };\n" +
                "        }";
        MapReduceResults<LinkedHashMap> reduceResults = mongoOperations.mapReduce(query, "order_info", mapStr, reduce, LinkedHashMap.class);

        Double score = 0D;
        for (LinkedHashMap map : reduceResults) {
            Map map2 = (Map) map.get("value");
            score += (Double) map2.get("score");
        }
        return score.intValue();
    }

reduce函數中return的值須要跟map函數中key的數據結構一致。函數

相關文章
相關標籤/搜索