介紹
Map-reduce 是一種數據處理范式,用於將大量數據壓縮為有用的聚合結果。對於 map-reduce 操作,MongoDB 提供MapReduce數據庫命令。
MongoDB中的MapReduce主要有以下幾階段:
1、Map:把一個操作Map到集合中的每一個文檔
2、Shuffle: 根據Key分組對文檔,並且為每個不同的Key生成一系列(>=1個)的值表(List of values)。
3、Reduce: 處理值表中的元素,直到值表中只有一個元素。然后將值表返回到Shuffle過程,循環處理,直到每個Key只對應一個值表,並且此值表中只有一個元素,這就是MR的結果。
4、Finalize:此步驟不是必須的。在得到MR最終結果后,再進行一些數據“修剪”性質的處理。
處理過程
db.runCommand({ mapreduce:<collection>, map:<mapfunction>, reduce:<reducefunction>, [,query:<query filter object>] [,sort:<sorts the input objects using this key.Useful for optimization,like sorting by the emit key for fewer reduces>] [,limit:<number of objects to return from collection>] [,out:<see output options below>] [,keeptemp:<true|false>] [,finalize:<finalizefunction>] [,scope:<object where fields go into javascript global scope>] [, jsMode : boolean,default true] [,verbose:true] });
參數說明:
-
Mapreduce:要操作的目標集合
-
Map:映射函數(生成鍵值對序列,作為reduce函數參數)
-
Reduce:統計函數
-
Query:目標記錄過濾
-
Sort:目標記錄排序
-
Limit:限制目標記錄數量
-
Out:統計結果存放集合(不指定使用臨時集合,在客戶端斷開后自動刪除)
-
Keeptemp:是否保留臨時集合
-
Finalize:最終處理函數(對reduce返回結果進行最終整理后存入結果集合)
-
Scope:向map、reduce、finalize導入外部變量
-
jsMode說明:為false時 BSON-->JS-->map-->BSON-->JS-->reduce-->BSON,可處理非常大的mapreduce,為true時 BSON-->js-->map-->reduce-->BSON
-
Verbose:顯示詳細的時間統計信息
執行查詢的步驟
-
MapReduce對指定的集合Collection進行查詢
-
對A的結果集進行mapper方法采集
-
對B的結果執行finalize方法處理
-
最終結果集輸出到臨時Collection中
-
斷開連接,臨時Collection刪除或保留
以下是來自文檔的圖,可以清楚的說明 Map-Reduce 的執行過程。
MongoDB中使用emit函數向MapReduce提供Key/Value對。
Reduce函數接受兩個參數:Key,emits. Key即為emit函數中的Key。 emits是一個數組,它的元素就是emit函數提供的Value。
Reduce函數的返回結果必須要能被Map或者Reduce重復使用,所以返回結果必須與emits中元素結構一致。
Map或者Reduce函數中的this關鍵字,代表當前被Mapping文檔。
構造數據:
db.orders.insertMany([{cust_id:'A123',amount:500,status:'A'}, {cust_id:'A123',amount:250,status:'A'}, {cust_id:'B212',amount:200,status:'A'}, {cust_id:'A123',amount:100,status:'D'}])
執行結果: