1. 程式人生 > >MongoDB MapReduce學習筆記

MongoDB MapReduce學習筆記

原文連結:http://www.cnblogs.com/loogn/archive/2012/02/09/2344054.html

MapReduce應該算是MongoDB操作中比較複雜的了,自己開始理解的時候還是動了動腦子的,所以記錄在此!

命令語法:詳細看

db.runCommand( { mapreduce : 字串,集合名, map : 函式,見下文 reduce : 函式,見下文 [, query : 文件,發往map函式前先給過渡文件] [, sort : 文件,發往map函式前先給文件排序] [, limit : 整數,發往map函式的文件數量上限] [, out : 字串,統計結果儲存的集合]
[, keeptemp: 布林值,連結關閉時臨時結果集合是否儲存] [, finalize : 函式,將reduce的結果送給這個函式,做最後的處理] [, scope : 文件,js程式碼中要用到的變數] [, jsMode : 布林值,是否減少執行過程中BSON和JS的轉換,預設true] //注:false時 BSON-->JS-->map-->BSON-->JS-->reduce-->BSON,可處理非常大的mapreduce,<br>                                    //true時BSON-->js-->map-->reduce-->BSON
[, verbose : 布林值,是否產生更加詳細的伺服器日誌,預設true] } );

 測試資料:

現在我要統計同一age的name,也就是像如下的結果:

{age:0,names:["name_6","name_12","name_18"]}
{age:1,names:["name_1","name_7","name_13","name_19"]}
......

第一步是寫對映(Map)函式,可以簡單的理解成分組吧~

var m=function(){
emit(this.age,this.name);
}

emit的第一個引數是key,就是分組的依據,這是自然是age了,後一個是value,可以是要統計的資料,下面會說明,value可以是JSON物件。
這樣m就會把送過來的資料根據key分組了,可以想象成如下結構:

第一組
{key:0,values: ["name_6","name_12","name_18"]

第二組
{key:1,values: ["name_1","name_7","name_13","name_19"]
......

組中的key其實就是age的值了,values是個陣列,陣列內的成員都有相同的age!!。

第二步就是簡化了,編寫reduce函式:

var r=function(key,values){
var ret={age:key,names:values};
return ret;
}

reduce函式會處理每一個分組,引數也正好是我們想像分組裡的key和values。

這裡reduce函式只是簡單的把key和values包裝了一下,因為不用怎麼處理就是我們想要的結果了,然後返回一個物件。物件結構正好和我們想象的相符!:

{age:對應的age,names:[名字1,名字2..]}

最後,還可以編寫finalize函式對reduce的返回值做最後處理:

var f=function(key,rval){
if(key==0){
rval.msg="a new life,baby!";
}
return rval
}

這裡的key還是上面的key,也就是還是age,rval是reduce的返回值,所以rval的一個例項如:{age:0,names:["name_6","name_12","name_18"]},

這裡判斷 key 是不是 0 ,如果是而在 rval 物件上加 msg 屬性,顯然也可以判斷 rval.age==0,因為 key 和 rval.age 是相等的嘛!!

這裡其他的選項就不說了,一看就知道。

執行:

複製程式碼
db.runCommand({
mapreduce:"t",
map:m,
reduce:r,
finalize:f,
out:"t_age_names"
}
)
複製程式碼

結果匯入到 t_age_names 集合中,查詢出來正是我想要的結果,看一下文件的結構,不難發現,_id 就是 key,value 就是處理後的返回值。

相關推薦

MongoDB MapReduce學習筆記

原文連結:http://www.cnblogs.com/loogn/archive/2012/02/09/2344054.html MapReduce應該算是MongoDB操作中比較複雜的了,自己開始理解的時候還是動了動腦子的,所以記錄在此! 命令語法:詳細看

MongoDB Java 學習筆記 (Java操作MongoDB)

sdn 學習筆記 style god java 學習 筆記 b- 學習 .net 原文地址:http://blog.csdn.net/ererfei/article/details/50857103 參考文檔:http://www.runoob.com/mongodb/mo

mapreduce學習筆記二:去重實驗

bound pac except 計算 throws 問題 多少 tasks tostring 實驗原理 “數據去重”主要是為了掌握和利用並行化思想來對數據進行有意義的篩選。統計大數據集上的數據種類個數、從網站日誌中計算訪問地等這些看似龐雜的任務都

Mongodb 入門學習筆記

NoSql簡介 Not only sql,非關係型資料庫,用於超大規模的資料儲存 優點 高可擴充套件性 分散式計算 低成本 架構的靈活性,半結

mapreduce學習筆記四:排序

code 表示 特性 files writable arr pri 產生 怎麽 1.Map端: (1)每個輸入分片會讓一個map任務來處理,默認情況下,以HDFS的一個塊的大小(默認為64M)為一個分片,當然我們也可以設置塊的大小。map輸出的結果會暫且放在一個環形內存緩

mapreduce學習筆記三:平均值

求平均數是MapReduce比較常見的演算法,求平均數的演算法也比較簡單,一種思路是Map端讀取資料,在資料輸入到Reduce之前先經過shuffle,將map函式輸出的key值相同的所有的value值形成一個集合value-list,然後將輸入到Reduce端,Reduce端彙總並且統計記錄數,然後作商即可

MapReduce學習筆記(3) ——輸入格式

來源:《Hadoop權威指南(第2版)》 單純摘抄 1. 幾個概念 輸入分片:單個map處理的輸入塊。 記錄:每個輸入分片劃分為若干個記錄,每條記錄就是一個鍵/值對,map一個接一個地處理每條記錄。   2. 輸入分片 輸入分片在JAVA中表現為Input

MongoDB Java 學習筆記

【前言】 由於處於執行緒安全等考慮,MongoDBJava從3.0開始已經打算廢棄DB開頭的類的使用,所以整體呼叫上有了較大的區別,特以此文志之 【正文】 環境配置 在Java程式中如果要使用MongoDB,你需要確保已經安裝了Java環境及MongoDB JDBC 驅

MongoDB快速學習筆記

use mongo db.student.insert({"name":"mongo"})  插入一條資料 db.student.find()  查詢 db.student.find({"age":20}) 查詢年齡為20 db.student.fi

MongoDB架構學習筆記

MongoDB的需求目標    MongoDB是一款知名的NoSQL資料庫,其設計哲學是結合關係型資料庫的核心能力和NoSQL的關鍵技術。    上圖的左側即MongoDB目標實現的關係型資料庫的關鍵能力:善於表達的查詢語言:使用者應能夠使用豐富的方法訪問和操作資料,以支援聯

MapReduce學習筆記之Reduce任務(四)

1. Reduce任務 Reduce任務是一個數據聚合的步驟。數量預設為1,而使用過多的Reduce任務則意味著複雜的shuffle,並使輸出檔案的數量激增。mapreduce.job.reduces屬性設定reduce數量,也可以通過程式設計的方式,呼叫Jo

MongoDB學習筆記-基本概念

MongoDB  概念解析 不管我們學習什麼資料庫都應該學習其中的基礎概念,在mongodb中基本的概念是文件、集合、資料庫,下面我們挨個介紹。 下表將幫助您更容易理解Mongo中的一些概念: SQL術語/概念 MongoDB術語/概念 解釋/說明 database database 資料

MapReduce學習筆記之資料連線(六)

1. Map側連線 Map端join是指資料到達map處理函式之前進行合併的,效率要遠遠高於Reduce端join,因為Reduce端join是把所有的資料都經過Shuffle,非常消耗資源。 注意:在Map端join操作中,我們往往將較小的表新增到記憶

Hadoop 學習筆記 (2) -- 關於MapReduce

規模 pre 分析 bsp 學習筆記 reduce 數據中心 階段 圖例 1. MapReduce 定義: 是一種可用於數據處理的編程的模型 優勢: MapReduce 本質上是並行運行的,因此可以將大規模的數據分析任務,分發給任何一個擁有足夠多機器

mongoDB學習筆記(一)

介紹 tle 狀態 負載 tutorial dir 基於 管理 集合 說明: MongoDB由databases組成,database由collections組成,collection由documents組成,document由fileds組成。MongoDB是異步寫數據

MongoDB學習筆記(二)

.get 條件過濾 條件 $set system.in ins version tle 不存在 一、Mongodb命令 說明:Mongodb命令是區分大小寫的,使用的命名規則是駝峰命名法。 對於database和collection無需主動創建,在插入數據時,如果dat

MongoDB學習筆記—常用命令

upd 鍵值 操作 false doc cer 查看 數據庫 創建 這裏記錄一下MongoDB常用的命令 數據庫相關 創建數據庫 use DATABASE_NAME 如果數據庫不存在,則創建數據庫,否則切換到指定數據庫。 刪除數據庫:切換到要刪除的數據庫下,執行

MongoDB 學習筆記之 權限管理基礎

顯示 命令 修改 技術 sky 需要 bad 官方 改密碼 權限管理基礎 MongoDB有很多用戶roles,這裏只是簡單列舉下命令的使用,具體的role的含義,請查閱官方文檔。 https://docs.mongodb.com/manual/reference/bui

Spark 學習筆記MONGODB SPARK CONNECTOR 插入性能測試

log font span 技術 strong mongos str server 學習 MONGODB SPARK CONNECTOR 測試數據量: 測試結果: 116萬數據通過4個表的join,從SQL Server查出,耗時1分多。MongoSp

MongoDB 學習筆記之 分片和副本集混合運用

comment ssm table mmap insert ise class 學習 urn 分片和副本集混合運用: 基本架構圖: 搭建詳細配置: 3個shard + 3個replicat set + 3個configserver + 3個Mongos sh