mongodbのMapReduce学習

4978 ワード

MongoDbはNoSQlで現在流行している分散型ストレージのソリューションで、主従、コピーセット、スライスなどがよくサポートされており、分散型ストレージのアーキテクチャの下で、自然に分散型の計算があり、MapReduceはMongodbの分散型計算サポートである.
 
そのMapReduceはGroupByに似た効果があります.まずMap:コレクションを巡り、同じValueを持つKeyを1つのKey:Valuesのキー値ペアにまとめ、パラメータとしてReduce関数に渡し、Reduce関数によってさらに簡略化し、最後に指定したコレクションに結果を書きます.
mongo内蔵count,distinct,groupの機能MapReduceが実現
 
> db.events.count();
13321
> db.runCommand({"distinct":"events","key":"type"});
{
        "values" : [
                "IPA",
                "IPI",
                "REG",
                "OTDPS",
                "IPO",
                "EXO",
                "IPOP",
                "ECG",
                "ASO",
                "CUR"
        ],
        "stats" : {
                "n" : 13321,
                "nscanned" : 13321,
                "nscannedObjects" : 13321,
                "timems" : 117,
                "cursor" : "BasicCursor"
        },
        "ok" : 1
}
>

 
彼の文法を見てみましょう.
   db.runCommand(   { mapreduce : ,     map : js     reduce : js     [, query : , map ]     [, sort : , map ]     [, limit : , map ]     [, out : , ]     [, keeptemp: , ]     [, finalize : , reduce , ]     [, scope : ,js ]     [, jsMode : , BSON JS , true ]     [, verbose : , , true ]
} ); に な を げます. えば、 が「 」の の と が「 」の の を つけます. は によって にグループ する です.
テストデータを する
1 MongoDbに する に
   
 mongo.exe localhost:27017;
 use test_his;
 db.auth("test","test");
   
2 データの
   
 db.mrtest.insert({"name"  : "  ","sex" : "M"});
 db.mrtest.insert({"name"  : "  ","sex" : "M"});
 db.mrtest.insert({"name"  : "  ","sex" : "F"});
 db.mrtest.insert({"name"  : "  ","sex" : "F"});
 db.mrtest.insert({"name"  : "  ","sex" : "M"});
3 Map の (emit び し)
  
var map=function(){
	emit(this.sex,this.name);
 } 

Emit の1 のパラメータはパケットのKEY、2 のパラメータは するデータ(フォーマットはJSONタイプ)
4 Reduce の
   
 var reduce=function(key,values){
     // var retur={sex:key,names:values};
 	 var retur={names:values};
      return retur;
 }
Reduce は、SEXでグループ された のリストを します.この り はSEXを ち むことができます. の です.
5テストfinalize
finalize の
 
var final=function(key,retur){
     if(key=="M"){
    	retur.msg="is a man";
    }
	return retur;
 }
なら「is a man」
6 dbを する.runCommand() び し
 
 db.runCommand({
    mapreduce:"mrtest",
    map:map,
    reduce:reduce,
    finalize:final,
    out:"sextest"
   });
をsextestに
 

> db.sextest.find();
{“_id”:“F”,“value”:{“names”:[“ ”,“ ”}}
{“_id”:“M”,“value”:{“names”:[“ ”,“ ”,“ ”,“msg”:“is a m
an"} }
   
は によってグループ して、 を し して、もし のいくつかを するならば、MapReduceはまたこのように することができます
    
 var map=function(){  
    emit(this.sex,{count:1});  
 }    

 var reduce=function(key,values){  
        var cou=0;
        for(var i=0;i<values.length;i++){
		cou+=values[i].count;
        }
        var retur={sex:key,count:cou};  
        return retur;  
  }  
 
これは なMapReducの で、もちろんJAVAコードを って を び すこともできます. MongoDbのプログラミングフレームワークに して、Spring Data For Mongodbが く われていますが、SpringはMapReduce をあまりカプセル していません.Map、ReduceのFunction を の で し、RunCommandで する があります.このようにコードはメンテナンスが しいように えるので、 に じてHadoopプログラミングフレームワークを することをお めします.コードは に えます.