zoukankan      html  css  js  c++  java
  • MapReduce

    一、什么是MapReduce

    不要看百度百科上那个解释,什么映射啦,归约啦,我靠,什么鬼东西?这个解释成功地将一个简单的道理说到无人能懂。

    还有个印度傻逼,说要给他那个傻乎乎的老婆解释什么是MapReduce,晒命似的专门跑到披萨店里去举洋葱作为例子,冗长得要命,越说越糊涂。这说明这个傻逼阿三自己也没弄明白。

    其实,Map就是分解执行,Reduce就是结果合并

    有老外用极其简单的例子解释得清清楚楚:

    我们要数图书馆中的所有书。你数1号书架,我数2号书架。这就是“Map”。我们人越多,数书就越快。

    然后我们到一起,把所有人的统计数加在一起。这就是“Reduce”。

    二、MapReduce有什么用

    看上去,MapReduce跟大数据处理有关。数据很大,分布在好多服务器里,于是分解执行,然后结果合并,得到最终结果。


    三、MongoDB中的mapReduce

    MongoDB里也有MapReduce,但大家举的例子,似乎MongoDB版的MapReduce与关系型数据的group by类似。大概是mongoDB中的分组操作,会自然而然地适用于分布式计算吧?

    假设集合TalkRecord有文档结构类似:

    { "_id" : ObjectId("54179064b3d587157c805001"), "id" : 220936, "content" : "Hello World!" }

    我们可以写这么一个MapReduce:

    > db.talkrecord.mapReduce( function(){emit(this.id,1)}, function(key,values){return Array.sum(values)}, {query:{id:220936}, out:"post_total" } )
    map函数中,emit是必须的。

    emit(key,value)中,那么这个key,value怎么赋值呢?我觉得这有点误导,以为key必定是字段名,value是该字段的值,那么

    [javascript] view plaincopy
    1. emit(this.id,1)  

    作何解释,难道是this.id==1才行,这样岂不是成了过滤条件啦?

    其实,emit(key,value)中,key相当于group by 的字段,value则是 聚合操作的字段。比如关系型数据库中,有SQL语句

    1. select sum([money]) from t group by userId  
    那在mongodb这里,userId就相当于emit里的KEY,money就相当于value。

    emit(this.Id,1)的意思是,按id分组,数个数。1,跟count(1)差不多意思,你写个100,其实结果也一样。


  • 相关阅读:
    MySql面试题、知识汇总、牛客网SQL专题练习
    产生过拟合的原因
    《人类简史》这本烧脑书风靡全球的秘密是什么?
    厌食?暴食?试试这个 VR 新疗法
    协程、异步IO
    进程池
    进程(同步)锁
    特朗普变脸:同媒体“友好会谈”,怨媒体“死不悔改”
    多进程Queue
    redis 在 php 中的应用(事务 [ Transaction ] 篇)
  • 原文地址:https://www.cnblogs.com/leftfist/p/4257878.html
Copyright © 2011-2022 走看看