Step into MongoDB - 11 - MapReduce

目录

摘要

MapReduce 概念,与 group 区别,使用

MapReduce

概述

  • MapReduce 是聚合工具,可以实现 count,distinct,group 等功能。
  • MapReduce 是并行化到多个服务器的聚合方法。它会拆开问题,发送到各个机器上,再从各个机器上汇聚结果返回。

与 group 的区别

  • 由映射函数 (mapper) 用一个主键去调用 emit() 函数。而不是 map() 函数返回转换过的值。这样的好处是每个文档可以不止发出一次。
  • 效率比 group 慢,不适用于实时环境中,而应该用在后台任务中。

执行步骤

  • 映射 (map) 将操作映射到集合中的每个文档。
  • 洗牌 (shuffle) 按照键分组,并将产生的键值组成列表放到对应的键中。
  • 化简 (reduce) 将列表中的值化简成一个单值。这个值被返回,接着再洗牌,直到每个键的列表只有一个值为止。

使用

测试数据
db.things.insert( { _id : 1, tags : ['dog', 'cat'] } );
db.things.insert( { _id : 2, tags : ['cat'] } );
db.things.insert( { _id : 3, tags : ['mouse', 'cat', 'dog'] } );
db.things.insert( { _id : 4, tags : []  } );
mapper
map = function(){
        this.tags.forEach(
            function(z){
                emit( z , { count : 1 } );
            }
        );
      };

emit 返回一组键值对, key 为第一个参数,values 为第二组参数的集合

在上述例子中,即返回 {'dog' : [{ count : 1, { count:1 }], 'cat' : ...}

reducer
reduce = function(key, values) {
  var total = 0;
  for(var i = 0; i< values.length; i++) {
    total += values[i].count;
  }
  return { count : total };
}

reduce 用于将 map 传递过来的 key-values 转变成 key-value。其两个参数即为 emit 返回的参数。

运行 mapreduce
results = db.runCommand({
    mapReduce : 'phones',
    map : map,
    reduce : reduce,
    out : 'phones.report'
})

db.phones.report.find({ '_id.country' : 8})

以上将结果存储到 phones.report 集合中,之后可以直接使用此表进行查询。

或者

db.things.mapReduce( map, reduce, { out : 'tmp' } )

db.tmp.find()

参数含义

  • mapReduce 执行的集合名
  • map 映射函数
  • reduce 规约函数
  • out 输出的集合名
    • 值为 { inline : 1} 会直接输出结果而不是放到集合中。但是输出长度根据 MongoDB 的版本是有限制的。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值