亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > MongoDB > 正文

MongoDB中的MapReduce簡介

2020-10-29 18:51:13
字體:
來源:轉載
供稿:網友

MongoDB MapReduce

MapReduce是一種計算模型,簡單的說就是將大批量的工作(數據)分解(MAP)執行,然后再將結果合并成最終結果(REDUCE)。這樣做的好處是可以在任務被分解后,可以通過大量機器進行并行計算,減少整個操作的時間。

上面是MapReduce的理論部分,下面說實際的應用,下面以MongoDB MapReduce為例說明。

下面是MongoDB官方的一個例子:

復制代碼 代碼如下:

> db.things.insert( { _id : 1, tags : ['dog', 'cat'] } );
> db.things.insert( { _id : 2, tags : ['cat'] } );
> db.things.insert( { _id : 3, tags : ['mouse', 'cat', 'dog'] } );
> db.things.insert( { _id : 4, tags : []  } );

> // map function
> map = function(){
...    this.tags.forEach(
...        function(z){
...            emit( z , { count : 1 } );
...        }
...    );
...};

> // reduce function
> reduce = function( key , values ){
...    var total = 0;
...    for ( var i=0; i<values.length; i++ )
...        total += values[i].count;
...    return { count : total };
...};

db.things.mapReduce(map,reduce,{out:'tmp'})
{
    "result" : "tmp",
    "timeMillis" : 316,
    "counts" : {
        "input" : 4,
        "emit" : 6,
        "output" : 3
    },
    "ok" : 1,
}
> db.tmp.find()
{ "_id" : "cat", "value" : { "count" : 3 } }
{ "_id" : "dog", "value" : { "count" : 2 } }
{ "_id" : "mouse", "value" : { "count" : 1 } }

例子很簡單,計算一個標簽系統中每個標簽出現的次數。

這里面,除了emit函數之外,所有都是標準的js語法,這個emit函數是非常重要的,可以這樣理解,當所有需要計算的文檔(因為在mapReduce時,可以對文檔進行過濾,接下來會講到)執行完了map函數,map函數會返回key_values對,key即是emit中的第一個參數key,values是對應同一key的emit的n個第二個參數組成的數組。這個key_values會作為參數傳遞給reduce,分別作為第1.2個參數。

reduce函數的任務就是將key-values變成key-value,也就是把values數組變成一個單一的值value。當key-values中的values數組過大時,會被再切分成很多個小的key-values塊,然后分別執行Reduce函數,再將多個塊的結果組合成一個新的數組,作為Reduce函數的第二個參數,繼續Reducer操作??梢灶A見,如果我們初始的values非常大,可能還會對第一次分塊計算后組成的集合再次Reduce。這就類似于多階的歸并排序了。具體會有多少重,就看數據量了。

reduce一定要能被反復調用,不論是映射環節還是前一個簡化環節。所以reduce返回的文檔必須能作為reduce的第二個參數的一個元素。

(當書寫Map函數時,emit的第二個參數組成數組成了reduce函數的第二個參數,而Reduce函數的返回值,跟emit函數的第二個參數形式要一致,多個reduce函數的返回值可能會組成數組作為新的第二個輸入參數再次執行Reduce操作。)

MapReduce函數的參數列表如下:

復制代碼 代碼如下:

db.runCommand(
 { mapreduce : <collection>,
   map : <mapfunction>,
   reduce : <reducefunction>
   [, query : <query filter object>]
   [, sort : <sort the query.  useful for optimization>]
   [, limit : <number of objects to return from collection>]
   [, out : <output-collection name>]
   [, keeptemp: <true|false>]
   [, finalize : <finalizefunction>]
   [, scope : <object where fields go into javascript global scope >]
   [, verbose : true]
 }
);

或者這么寫:
復制代碼 代碼如下:

db.collection.mapReduce(
                         <map>,
                         <reduce>,
                         {
                           <out>,
                           <query>,
                           <sort>,
                           <limit>,
                           <keytemp>,
                           <finalize>,
                           <scope>,
                           <jsMode>,
                           <verbose>
                         }
                       )

1.mapreduce:指定要進行mapreduce處理的collection
2.map:map函數
3.reduce:reduce函數
4.out:輸出結果的collection的名字,不指定會默認創建一個隨機名字的collection(如果使用了out選項,就不必指定keeptemp:true了,因為已經隱含在其中了)
5.query:一個篩選條件,只有滿足條件的文檔才會調用map函數。(query。limit,sort可以隨意組合)
6.sort:和limit結合的sort排序參數(也是在發往map函數前給文檔排序),可以優化分組機制
7.limit:發往map函數的文檔數量的上限(要是沒有limit,單獨使用sort的用處不大)
8.keytemp:true或false,表明結果輸出到的collection是否是臨時的,如果想在連接關閉后仍然保留這個集合,就要指定keeptemp為true,如果你用的是MongoDB的mongo客戶端連接,那必須exit后才會刪除。如果是腳本執行,腳本退出或調用close會自動刪除結果collection
9.finalize:是函數,它會在執行完map、reduce后再對key和value進行一次計算并返回一個最終結果,這是處理過程的最后一步,所以finalize就是一個計算平均數,剪裁數組,清除多余信息的恰當時機
10.scope:javascript代碼中要用到的變量,在這里定義的變量在map,reduce,finalize函數中可見
11.verbose:用于調試的詳細輸出選項,如果想看MpaReduce的運行過程,可以設置其為true。也可以print把map,reduce,finalize過程中的信息輸出到服務器日志上。

執行MapReduce函數返回的文檔結構如下:

復制代碼 代碼如下:

  { result : <collection_name>,

    timeMillis : <job_time>,

    counts : {

               input : <number of objects scanned>,

               emit : <number of times emit was called>,

               output : <number of items in output collection>

     } ,

     ok : <1_if_ok>,

     [, err : <errmsg_if_error>]

}

1.result:儲存結果的collection的名字,這是個臨時集合,MapReduce的連接關閉后自動就被刪除了。
2.timeMillis:執行花費的時間,毫秒為單位
3.input:滿足條件被發送到map函數的文檔個數
4.emit:在map函數中emit被調用的次數,也就是所有集合中的數據總量
5.ouput:結果集合中的文檔個數(count對調試非常有幫助)
6.ok:是否成功,成功為1
7.err:如果失敗,這里可以有失敗原因,不過從經驗上來看,原因比較模糊,作用不大

java代碼執行MapReduce的方法:

復制代碼 代碼如下:

public void MapReduce() {
        Mongo mongo = new Mongo("localhost",27017);
        DB db = mongo.getDB("qimiguangdb");
        DBCollection coll = db.getCollection("collection1");
      
        String map = "function() { emit(this.name, {count:1});}";
                                                                                                             
  
        String reduce = "function(key, values) {"; 
        reduce=reduce+"var total = 0;"; 
        reduce=reduce+"for(var i=0;i<values.length;i++){total += values[i].count;}"; 
        reduce=reduce+"return {count:total};}"; 
         
        String result = "resultCollection"; 
         
        MapReduceOutput mapReduceOutput = coll.mapReduce(map, 
                reduce.toString(), result, null); 
        DBCollection resultColl = mapReduceOutput.getOutputCollection(); 
        DBCursor cursor= resultColl.find(); 
        while (cursor.hasNext()) { 
            System.out.println(cursor.next()); 
        } 
    } 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美日韩中文字幕综合视频| 亚洲免费小视频| www国产精品视频| 色噜噜国产精品视频一区二区| 亚洲老头同性xxxxx| 精品久久久国产| 欧美人与性动交| 国产丝袜一区视频在线观看| 国产视频在线观看一区二区| 欧美日韩国产中字| 色噜噜亚洲精品中文字幕| 亚洲欧美综合区自拍另类| 91久久综合亚洲鲁鲁五月天| 中文字幕av一区二区| 美日韩丰满少妇在线观看| 亚洲精品国产精品久久清纯直播| 欧美夜福利tv在线| 88xx成人精品| 成人激情黄色网| 国产一区二区三区免费视频| 国产一区深夜福利| 中文字幕综合一区| 国产视频自拍一区| 中文字幕亚洲欧美一区二区三区| 国产99久久精品一区二区永久免费| 91啪国产在线| 国产精品久久久久久久美男| 国产69精品久久久久9| 亚洲欧美成人网| 91免费综合在线| 精品视频久久久久久久| 国产91九色视频| 亚洲字幕在线观看| 国产精品99久久久久久久久| 在线成人中文字幕| 精品国产一区二区在线| 精品动漫一区二区| 亚洲二区在线播放视频| 91精品久久久久久久久久久| 在线观看欧美日韩国产| 中国人与牲禽动交精品| 国产精品午夜国产小视频| 精品无码久久久久久国产| 国产午夜精品视频免费不卡69堂| 欧美性xxxxxxxxx| 一本大道亚洲视频| 2020欧美日韩在线视频| 国产日韩欧美电影在线观看| 成人在线播放av| 国产视频精品va久久久久久| 久久国内精品一国内精品| 国产精品69av| 亚洲国产成人在线视频| 欧美性xxxxx极品娇小| 国产精品福利网| 亚洲国产精品成人va在线观看| 欧美视频13p| 国产视频久久久久| 日本一欧美一欧美一亚洲视频| 亚洲午夜精品久久久久久久久久久久| 久久精品电影网站| 成人免费xxxxx在线观看| 一区二区三区视频在线| 久久精品国产清自在天天线| 国产精品福利久久久| 成人乱色短篇合集| 欧美日韩一区免费| 日本视频久久久| 精品成人久久av| 国产亚洲免费的视频看| 国产精品久久精品| 美女999久久久精品视频| 欧美富婆性猛交| 国产精品爽黄69天堂a| 97久久精品国产| 国产免费观看久久黄| 一区二区三欧美| 欧美日韩精品二区| 国产视频精品va久久久久久| 国产专区欧美专区| 中文字幕免费国产精品| 最近2019中文字幕一页二页| 日韩精品在线播放| 韩国一区二区电影| 国产成人在线一区二区| 国产啪精品视频| 日韩精品中文字幕久久臀| www.久久久久久.com| 日韩视频在线一区| 2018日韩中文字幕| 中文日韩电影网站| 岛国av一区二区在线在线观看| 亚洲最大的av网站| 欧美亚洲成人xxx| 久久久成人的性感天堂| 欧美精品激情blacked18| 蜜臀久久99精品久久久无需会员| 欧美另类精品xxxx孕妇| 黄色成人在线免费| 国产一区深夜福利| 欧美在线xxx| 日韩成人激情影院| 亚洲视频在线观看视频| 国产日韩欧美在线观看| 亚洲美女视频网站| 不卡伊人av在线播放| 亚洲美女喷白浆| 国产亚洲xxx| 精品偷拍一区二区三区在线看| 日韩免费av一区二区| 这里只有精品久久| 成人免费xxxxx在线观看| 精品激情国产视频| 国产一级揄自揄精品视频| 亚洲成在人线av| 91成人天堂久久成人| 91在线观看免费高清完整版在线观看| 国产精品视频资源| 欧美精品第一页在线播放| 色综合视频一区中文字幕| 亚洲桃花岛网站| 久久伊人免费视频| 国产精品一区二区3区| 午夜精品久久久久久久久久久久久| 成人国产亚洲精品a区天堂华泰| 欧美日韩国产激情| 国产精品视频一区二区高潮| 伊人青青综合网站| 国产精品久久久久福利| 日韩免费在线看| 亚洲第一区第二区| 亚洲电影免费观看高清完整版在线| 日韩av成人在线观看| 日韩中文字幕精品视频| 亚洲国产三级网| 久久精品一区中文字幕| 国外日韩电影在线观看| 欧美国产乱视频| 日韩有码在线视频| 成人免费大片黄在线播放| 亚洲男人的天堂在线| 国产精品视频在线观看| 国产成人精品网站| 中文字幕亚洲欧美| 日韩欧美高清视频| 欧美第一页在线| 国产精品成人国产乱一区| 成人a在线视频| 久热精品视频在线观看一区| 日本精品一区二区三区在线| 欧美午夜片在线免费观看| 国产日韩精品综合网站| 精品一区二区三区四区| 91在线观看欧美日韩| 国产精品中文在线| 91久久久国产精品| 精品久久久一区| 欧美与黑人午夜性猛交久久久| 欧美成人免费va影院高清| 亚洲第一av网站| 欧美激情网友自拍| 亚洲综合日韩在线| 中文字幕av一区中文字幕天堂| 日本欧美中文字幕|