MongoDB( 六 )MongoDB之MapReduce

7 篇文章 1 订阅

目录

 

MongoDB Map Reduce

MapReduce 命令

以上执行顺序为:

map-reduce操作执行注意事项:

Java代码写法


MongoDB Map Reduce

Map-Reduce是一种计算模型,简单的说就是将大批量的工作(数据)分解(MAP)执行,然后再将结果合并成最终结果(REDUCE)。

MongoDB提供的Map-Reduce非常灵活,对于大规模数据分析也相当实用。

MapReduce 命令

>db.collection.mapReduce(
   function() {emit(key,value);},  // 它将一个值与一个键映射并发出一个键值对 , map 函数(映射器) key 与 value 为集合中任意参数 key需唯一
   function(key,values) {return reduceFunction},   // reduce 函数(可对map结果进一步处理) 可以减少或分组具有相同键的所有文档
   {
      out: "colecctionName", //指定map-reduce查询结果的位置 , 可以指定输出集合名称  如果不指定"db" 默认输出当前库
       // 还可以这么写 
      out: {
        replace: "dddddddd",  // 指定输出类型 replace: 替换  new: 新建  merge:(根据唯一key)进行合并 , key 值一致则丢弃原有数据 , 
        db: "switch_data_log" // 可指定输出到其他库 , 也可以不指定
      },
      query: {name:"huanghaha"},
      sort: {_id: 1},
      limit: 1000
   }
)

使用 MapReduce 要实现两个函数 Map 函数和 Reduce 函数,Map 函数调用 emit(key, value), 遍历 collection 中所有的记录, 将 key 与 value 传递给 Reduce 函数进行处理。

Map 函数必须调用 emit(key, value) 返回键值对。

参数说明:

  • map :映射函数 (生成键值对序列,作为 reduce 函数参数)。
  • reduce 统计函数,reduce函数的任务就是将key-values变成key-value,也就是把values数组变成一个单一的值value。。
  • out 统计结果存放集合 (不指定则使用临时集合,在客户端断开后自动删除)。
  • query 一个筛选条件,只有满足条件的文档才会调用map函数。(query。limit,sort可以随意组合)
  • sort 和limit结合的sort排序参数(也是在发往map函数前给文档排序),可以优化分组机制
  • limit 发往map函数的文档数量的上限(要是没有limit,单独使用sort的用处不大)

以下实例在集合 orders 中查找 status:"A" 的数据,并根据 cust_id 来分组,并计算 amount 的总和。

上图具体执行步骤如下:  

 

以上执行顺序为:

  1. 执行query筛选出特定数据
  2. 执行map返回键值对,这里的值可以是一个list
  3. 执行reduce对value求sum
  4. 得到名为order_totals的结果

map-reduce操作执行注意事项:

map-reduce操作由许多任务组成,包括从输入集合中读取,map函数执行,reduce函数执行,在处理过程中写入临时集合以及写入输出集合。

在操作期间,map-reduce采取以下锁定:

  • 读取阶段需要读取锁定。每100份文档产生一次。
  • 插入到临时集合中将对单个写入执行写锁定。
  • 如果输出集合不存在,则输出集合的创建将具有写锁定。
  • 如果输出集合存在,则输出操作(即 mergereplacereduce)采用写锁。此写锁定是全局的,并阻止对该mongod 实例的所有操作。

Java代码写法

实例:

 public void mongoMapReduceTest() {
        Query query = new Query();
        query.addCriteria(Criteria.where("temperature").gt(26.5));
        // emit 函数的value 可以使数组形式 , 数组内字段内容可自行选择
        // 且支持自定义函数对数据进行操作
        String mapFunction = "function () {\n" +
                "\temit(this._id, {temperature:this.temperature , equipmentName:this.equipmentName" +
                ",createTime:new Date(), version: 'HK0001'});\n" +
                "}";
//        String reduceFunction = "function( key, values ){ return key + ': ' + values.join(', '); }";
        String reduceFunction = "function (key, values) {\n" +
                "\treturn values[0];\n" +
                "}";
        MapReduceOptions mapReduceOptions = new MapReduceOptions();
        // 指定输出集合
        mapReduceOptions.outputCollection("testMapReduce");
        // 具体执行信息
        mapReduceOptions.verbose(true);
        // 指定输出库
        mapReduceOptions.outputDatabase("switch_data_log");
        mongoTemplate.mapReduce(query, "break_1000002917_breaker478920_gx000025"
                , mapFunction, reduceFunction, mapReduceOptions, BasicDBObject.class);

    }

本文实例采用查询之后直接由Mongo进行数据转储 , 并未将数据获取到内存中进行操作!

 

 

 

 

 

 

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值