MongoDb中的MapReduce

MapReduce是面向大数据并行处理的计算模型。MongoDb中提供了MapReduce的聚合工具,来实现任意复杂的逻辑,很强大,很灵活。它的计算理念是:将一个大问题拆分成若干个小问题,将各个小问题发送到不同的机器上进行计算。在各个小问题解决完时,再将这些小问题的结果合并为一个最终的结果。

从设计理念可以看出,MapReduce操作有2个阶段:第一个阶段是Map(映射)阶段,第二个阶段是Reduce(化简)阶段。可以参考官网的一个demo:

MapReuce语句MapReuce流程图

  1. 先查找符合条件的数据:查找出order集合中所有status为A的记录。
  2. 然后执行Map(映射):根据order集合记录中cust_id字段为key,amount为value进行规约。所有相同的key的所有value,组成一个数组,传给后面的reduce。
  3. 最后进行Reduce(化简):是把由map传回来的key/value的value进行求和,得到最终以每个用户(cust_id)为key,所有金额求和的值为value的结果。最终结果out在临时表“order_totals”中。

附上我用java写的一段MapReduce代码:

/**
     * 查询订单表中的积分
     *
     * @return 积分数
     */
    public int selectOrderInfoScore(Query query) {
        String mapStr = "function() { emit(this.pay_type, { \"score\": this.score }) }";
        String reduce = "function(key, values) {\n" +
                "            var scores = 0;\n" +
                "            for (var i in values) {\n" +
                "                scores += values[i].score;\n" +
                "            }\n" +
                "            return { \"score\": scores };\n" +
                "        }";
        MapReduceResults<LinkedHashMap> reduceResults = mongoOperations.mapReduce(query, "order_info", mapStr, reduce, LinkedHashMap.class);

        Double score = 0D;
        for (LinkedHashMap map : reduceResults) {
            Map map2 = (Map) map.get("value");
            score += (Double) map2.get("score");
        }
        return score.intValue();
    }   
    

reduce函数中return的值需要跟map函数中key的数据结构一致。

转载于:https://my.oschina.net/u/2494581/blog/967452

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值