mondb MapReduce
MapReduce是一种计算模型。简单地说,就是分解大量的数据(map),然后将结果合并到最终结果(减少)中,这样做的好处是,在
任务分解后,可以通过大量的机器
并行计算,以减少整个
操作的时间。
以上是MapReduce的理论部分,和下面的实际应用,这是由mondb MapReduce为例。
以下是MonDB官方的一个例子:
复制代码代码如下所示:
> > db.things.insert({ _id:1,标签:{ 'dog,猫} });
> > db.things.insert({ _id:2,标签:{猫} });
> > db.things.insert({ _id:3,标签:{ 'mouse,猫,'dog} });
>(db.things.insert:4,标签:_id { { } });
> map
函数 > map =函数(){
…this.tags.foreach(
…函数(z){
…发出(z,{计数:1 });
…}
…);
} ..;
>减少函数
> =函数(键,值){
var总= 0;
…对于(var i = 0;i < values.length;i++)
总数=值{ };
…返回{计数:总};
} ..;
Db.things.mapReduce (map, reduce, {out:'tmp'})
{
结果:TMP
timemillis :316,
计数:{
输入:4,
发出:6,
输出:3
},
OK:1,
}
> > db.tmp.find()
{_id 猫
{_id 狗
{_id 老鼠
这个例子很简单,可以计算每个标签在标签
系统中出现的次数。
在这里,除了发射
功能,
都是标准的JS语法,发射功能是非常重要的,据了解,当所有需要计算的
文件(如MapReduce,可以过滤,文件会提到下)进行了地图功能,地图功能返回键的key_values。这是第一个
参数键发射,值是对应于相同的关键排放N二参数数组。这key_values作为参数为1.2个参数分别减少了。
减少功能的任务是把
核心价值观为核心价值,那就是把值数组成一个单一的值。当关键值数组中的值太大,会被切割成许多小块的关键值,然后
执行减少功能,然后多个块被组合成一个新的阵列,为减少二参数函数的减速操作。可以预见的是,如果我们的初始值是非常大的,我们还可以再降低的第一块计算后再定。这类似于多级合并
排序。这将是多少重量,看在数据量。
减少必须能够反复调用,无论是映射链接还是以前的简化。因此,由还原返回的
文档必须是减少的第二个参数的一个元素。
(当写入map函数时,发出第二个参数的数组是由减函数变成第二个参数,并返回值,减少函数与第二个参数的形式,发出的函数是一致的,多个还原函数返回值可以形成为一个数组的新的第二个输入参数来执行减少操作)。
MapReduce函数的参数列表如下所示:
复制代码代码如下所示:
Db.runCommand(
{ MapReduce:,
地图:,
减少:
{
查询:}
{排序:}
{限制:}
{,}:}
keeptemp:{,}
{,终结符:}
{范围:}
{
详细名}
}
);
或者写这个:
复制代码代码如下所示:
Db.collection.mapReduce(
,
,
{
,
,
,
,
,
,
,
,
}
)
1.mapreduce:指定要做MapReduce
处理托收
2:map:map函数
3减少功能
4.out:输出集合的名称不指定它将
默认为一个随机的名称
创建一个集合。如果你使用该
选项,你不需要指定keeptemp:真的,因为它已经暗示它。
5.query:过滤
条件,只有满足条件的文件,调用地图的功能。(query.limit,排序可随意组合)
6.sort:排序排序参数,结合极限(也在地图功能排序文件)可以
优化分组机制
7.limit:文件的数量上限,发送到地图功能(如果没有限制,使用排序单独)不是很有用。
8。keytemp:true或false指示从结果输出集合是暂时的。如果我们在
连接关闭时要收集,我们必须指定keeptemp为真。如果你使用mondb孟客户端连接,它必须被
删除后
退出。如果执行
脚本时,脚本退出或调用关闭自动删除的结果集
9.finalize:是一个函数,它将结束在地图的实现,减少键和值计算后返回一个结果,这是过程的最后一步,所以最终是一个计算的平均数,减少阵列,去除冗余信息的时候
10个范围中使用的变量:Javascript代码,这里定义的变量在map中可见,减少并完成函数。
11.verbose:详细的调试输出选项,如果你想看到mpareduce的
运行过程,它可以被
设置为true。
打印也可以输出信息的地图,减少,并最终确定流程
服务器日志。
执行MapReduce函数返回的文档结构如下所示:
复制代码代码如下所示:
{结果:,
TimeMillis:,
计数:{
输入:,
发出:,
输出:
},
好啊:,
{,}
}
1.result:用于存储结果的集合的名称,这是一个临时的收集,和MapReduce的连接是在连接关闭时自动删除。
2.timemillis:执行时间,毫秒
3.input:对满足条件的被发送到地图功能的文件数量
4.emit:在地图的功能称为发射次数,即在所有集合的数据总量
5.ouput:文档数量的结果集(算是调试很有帮助)
6.ok:是否成功或成功是1
7.err:如果你失败了,就失败的
原因,但从经验来看,其原因是相当模糊和不太多。
java代码执行MapReduce的方式:
复制代码代码如下所示:
公共无效MapReduce(){
上星期=新孟(localhost
分贝分贝= mon.getdb(qimiguangdb );
dbcollection学院= db.getcollection(面子);
弦图= 功能(){发出(this.name,{计数:1 });};
字符串函数(键,值){;
减少=var = 0;;
减少=减少+(var i = 0;i < values.length i++;{ } {我总=值。计数;});
减少=返回;
结果字符串=resultcollection ;
mapreduceoutput mapreduceoutput = coll.mapreduce(图,
Reduce.toString(),结果,空);
dbcollection resultcoll = mapreduceoutput.getoutputcollection();
dbcursor光标= resultcoll.find();
而(cursor.hasnext()){
(cursor.next System.out.println());
}
}