亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 6310 | 回復(fù): 1
打印 上一主題 下一主題

[MongoDB] MongoDB MapReduce [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2012-02-21 20:18 |只看該作者 |倒序?yàn)g覽
MongoDB MapReduce





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

對(duì)科班出生的程序員來說,最好的例子莫過于歸并排序的例子,沒錯(cuò),歸并排序流程就可以看作是一個(gè)MapReduce,只是我們?cè)趯W(xué)校寫過的歸并排序程序可能還沒有涉及到并行計(jì)算罷了。

上面是MapReduce的理論部分,下面說實(shí)際的應(yīng)用,下面以MongoDB MapReduce為例說明。

下面是MongoDB官方的一個(gè)例子:
  1. $ ./mongo
  2. > db.things.insert( { _id : 1, tags : ['dog', 'cat'] } );
  3. > db.things.insert( { _id : 2, tags : ['cat'] } );
  4. > db.things.insert( { _id : 3, tags : ['mouse', 'cat', 'dog'] } );
  5. > db.things.insert( { _id : 4, tags : []  } );

  6. > // map function
  7. > m = function(){
  8. ...    this.tags.forEach(
  9. ...        function(z){
  10. ...            emit( z , { count : 1 } );
  11. ...        }
  12. ...    );
  13. ...};

  14. > // reduce function
  15. > r = function( key , values ){
  16. ...    var total = 0;
  17. ...    for ( var i=0; i<values.length; i++ )
  18. ...        total += values[i].count;
  19. ...    return { count : total };
  20. ...};

  21. > res = db.things.mapReduce(m,r);
  22. > res
  23. {"timeMillis.emit" : 9 , "result" : "mr.things.1254430454.3" ,
  24. "numObjects" : 4 , "timeMillis" : 9 , "errmsg" : "" , "ok" : 0}

  25. > db[res.result].find()
  26. {"_id" : "cat" , "value" : {"count" : 3}}
  27. {"_id" : "dog" , "value" : {"count" : 2}}
  28. {"_id" : "mouse" , "value" : {"count" : 1}}
復(fù)制代碼
> db[res.result].drop()例子很簡單,計(jì)算一個(gè)標(biāo)簽系統(tǒng)中每個(gè)標(biāo)簽出現(xiàn)的次數(shù)。

這里面,除了emit函數(shù)之外,所有都是標(biāo)準(zhǔn)的js語法,當(dāng)然你也可以使用你所知道的所有標(biāo)準(zhǔn)js函數(shù)。而這個(gè)emit函數(shù)是非常重要的,他的作用是將一條數(shù)據(jù)放入數(shù)據(jù)分組集合,這個(gè)分組是以emit的第一個(gè)參數(shù)為key的。你可以這樣理解,當(dāng)你在所有需要計(jì)算的行執(zhí)行完了map函數(shù),你就得到了一組key-values對(duì);緆ey是emit中的key,values是每次emit函數(shù)的第二個(gè)參數(shù)組成的集合。

現(xiàn)在我們的任務(wù)就是將這一個(gè)key-values變?cè)趉ey-value,也就是把這一個(gè)集合變成一個(gè)單一的值。這個(gè)操作就是Reduce。

好像這里和我們前面的理論是完全一樣的,其實(shí)不然。當(dāng)我們的key-values中的values集合過大,會(huì)被再切分成很多個(gè)小的key-values塊,然后分別執(zhí)行Reduce函數(shù),再將多個(gè)塊的結(jié)果組合成一個(gè)新的集合,作為Reduce函數(shù)的第二個(gè)參數(shù),繼續(xù)Reducer操作?梢灶A(yù)見,如果我們初始的values非常大,可能還會(huì)對(duì)第一次分塊計(jì)算后組成的集合再次Reduce。這就類似于多階的歸并排序了。具體會(huì)有多少重,就看數(shù)據(jù)量了。

上面這一內(nèi)部機(jī)制,我們不必非常了解,但我們必須了解這一機(jī)制會(huì)要求我們遵守的原則,那就是當(dāng)我們書寫Map函數(shù)時(shí),emit的第二個(gè)參數(shù)形式是我們的Reduce函數(shù)的第二個(gè)參數(shù),而Reduce函數(shù)的返回值,可能會(huì)作為新的輸入?yún)?shù)再次執(zhí)行Reduce操作,所以Reduce函數(shù)的返回值也需要和Reduce函數(shù)的第二個(gè)參數(shù)結(jié)構(gòu)一致。

作為結(jié)束,下面照本宣科說一下MongoDB MapReduce調(diào)用參數(shù)和返回結(jié)果。

參數(shù)表如下:
  1. db.runCommand(
  2. { mapreduce : <collection>,
  3.    map : <mapfunction>,
  4.    reduce : <reducefunction>
  5.    [, query : <query filter object>]
  6.    [, sort : <sort the query.  useful for optimization>]
  7.    [, limit : <number of objects to return from collection>]
  8.    [, out : <output-collection name>]
  9.    [, keeptemp: <true|false>]
  10.    [, finalize : <finalizefunction>]
  11.    [, scope : <object where fields go into javascript global scope >]
  12.    [, verbose : true]
復(fù)制代碼
}
);mapreduce:指定要進(jìn)行mapreduce處理的collection
map:map函數(shù)
reduce:reduce函數(shù)
query:一個(gè)篩選條件,只有滿足條件的行才會(huì)加入mapreduce集合,而這個(gè)篩選過程是先于整個(gè)mapreduce流程而執(zhí)行的
sort:和query結(jié)合的sort排序參數(shù),這是唯一可以優(yōu)化分組機(jī)制的地方
limit:同上
out:結(jié)果輸出的collection的名字,不指定會(huì)默認(rèn)創(chuàng)建一個(gè)隨機(jī)名字的collection
keytemp:true或false,表明結(jié)果輸出到的collection是否是臨時(shí)的,如果為true,則會(huì)在客戶端連接中斷后自動(dòng)刪除,如果你用的是MongoDB的mongo客戶端連接,那必須exit后才會(huì)刪除。如果是腳本執(zhí)行,腳本退出或調(diào)用close會(huì)自動(dòng)刪除結(jié)果collection
finalize:和map,reduce一樣是一個(gè)函數(shù),它可以在reduce得出一個(gè)結(jié)果后再對(duì)key和value進(jìn)行一次計(jì)算并返回一個(gè)最終結(jié)果
scope:設(shè)置參數(shù)值,在這里設(shè)置的值在map,reduce,finalize函數(shù)中可見
verbose:在執(zhí)行過程中打印調(diào)試信息。
返回結(jié)果結(jié)構(gòu)如下:
  1. { result : <collection_name>,
  2.   counts : {
  3.        input :  <number of objects scanned>,
  4.        emit  : <number of times emit was called>,
  5.        output : <number of items in output collection>
  6.   } ,
  7.   timeMillis : <job_time>,
  8.   ok : <1_if_ok>,
  9.   [, err : <errmsg_if_error>]
復(fù)制代碼
}result:儲(chǔ)存結(jié)果的collection的名字
input:滿足條件的數(shù)據(jù)行數(shù)
emit:emit調(diào)用次數(shù),也就是所有集合中的數(shù)據(jù)總量
ouput:返回結(jié)果條數(shù)
timeMillis:執(zhí)行時(shí)間,毫秒為單位
ok:是否成功,成功為1
err:如果失敗,這里可以有失敗原因,不過從經(jīng)驗(yàn)上來看,原因比較模糊,作用不大

論壇徽章:
0
2 [報(bào)告]
發(fā)表于 2012-02-24 17:46 |只看該作者
謝謝分享
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP