mongodbのMapReduce学習
4978 ワード
MongoDbはNoSQlで現在流行している分散型ストレージのソリューションで、主従、コピーセット、スライスなどがよくサポートされており、分散型ストレージのアーキテクチャの下で、自然に分散型の計算があり、MapReduceはMongodbの分散型計算サポートである.
そのMapReduceはGroupByに似た効果があります.まずMap:コレクションを巡り、同じValueを持つKeyを1つのKey:Valuesのキー値ペアにまとめ、パラメータとしてReduce関数に渡し、Reduce関数によってさらに簡略化し、最後に指定したコレクションに結果を書きます.
mongo内蔵count,distinct,groupの機能MapReduceが実現
彼の文法を見てみましょう.
その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プログラミングフレームワークを することをお めします.コードは に えます.