Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 355|回复: 0

[默认分类] MongoDB MapReduce学习笔记

[复制链接]
  • TA的每日心情
    开心
    2021-12-13 21:45
  • 签到天数: 15 天

    [LV.4]偶尔看看III

    发表于 2018-6-23 11:17:44 | 显示全部楼层 |阅读模式
    MapReduce应该算是MongoDB操作中比较复杂的了,自己开始理解的时候还是动了动脑子的,所以记录在此!
    命令语法:详细看

    1. db.runCommand(
    2. { mapreduce : 字符串,集合名,
    3.    map : 函数,见下文
    4.    reduce : 函数,见下文
    5.    [, query : 文档,发往map函数前先给过渡文档]
    6.    [, sort : 文档,发往map函数前先给文档排序]
    7.    [, limit : 整数,发往map函数的文档数量上限]
    8.    [, out : 字符串,统计结果保存的集合]
    9.    [, keeptemp: 布尔值,链接关闭时临时结果集合是否保存]
    10.    [, finalize : 函数,将reduce的结果送给这个函数,做最后的处理]
    11.    [, scope : 文档,js代码中要用到的变量]
    12.    [, jsMode : 布尔值,是否减少执行过程中BSON和JS的转换,默认true] //注:false时 BSON-->JS-->map-->BSON-->JS-->reduce-->BSON,可处理非常大的mapreduce,
    13.                                     //true时BSON-->js-->map-->reduce-->BSON
    14.    [, verbose : 布尔值,是否产生更加详细的服务器日志,默认true]
    15. }
    16. );
    复制代码


    测试数据:

    现在我要统计同一age的name,也就是像如下的结果:

    1. {age:0,names:["name_6","name_12","name_18"]}
    2. {age:1,names:["name_1","name_7","name_13","name_19"]}
    3. ......
    复制代码


    第一步是写映射(Map)函数,可以简单的理解成分组吧~

    1. var m=function(){
    2.     emit(this.age,this.name);
    3. }
    复制代码


    emit的第一个参数是key,就是分组的依据,这是自然是age了,后一个是value,可以是要统计的数据,下面会说明,value可以是JSON对象。
    这样m就会把送过来的数据根据key分组了,可以想象成如下结构:

    1. 第一组
    2. {key:0,values: ["name_6","name_12","name_18"]
    3. 第二组
    4. {key:1,values: ["name_1","name_7","name_13","name_19"]
    5. ......
    复制代码


    组中的key其实就是age的值了,values是个数组,数组内的成员都有相同的age!!。
    第二步就是简化了,编写reduce函数:

    1. var r=function(key,values){
    2.     var ret={age:key,names:values};
    3.     return ret;
    4. }
    复制代码


    reduce函数会处理每一个分组,参数也正好是我们想像分组里的key和values。
    这里reduce函数只是简单的把key和values包装了一下,因为不用怎么处理就是我们想要的结果了,然后返回一个对象。对象结构正好和我们想象的相符!:

    1. {age:对应的age,names:[名字1,名字2..]}
    复制代码


    最后,还可以编写finalize函数对reduce的返回值做最后处理:

    1. var f=function(key,rval){
    2.     if(key==0){
    3.         rval.msg="a new life,baby!";
    4.     }
    5.     return rval
    6. }
    复制代码


    这里的key还是上面的key,也就是还是age,rval是reduce的返回值,所以rval的一个实例如:{age:0,names:["name_6","name_12","name_18"]},
    这里判断 key 是不是 0 ,如果是而在 rval 对象上加 msg 属性,显然也可以判断 rval.age==0,因为 key 和 rval.age 是相等的嘛!!
    这里其他的选项就不说了,一看就知道。
    运行:

    1. db.runCommand({
    2.     mapreduce:"t",
    3.     map:m,
    4.     reduce:r,
    5.     finalize:f,
    6.     out:"t_age_names"
    7.     }
    8. )
    复制代码



    结果导入到 t_age_names 集合中,查询出来正是我想要的结果,看一下文档的结构,不难发现,_id 就是 key,value 就是处理后的返回值。

    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-3-29 17:24 , Processed in 0.352096 second(s), 46 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表