【问题标题】:Unexpected behaviour with Mongodb MapreduceMongodb Mapreduce 的意外行为
【发布时间】:2013-04-21 20:45:38
【问题描述】:

我正在测试 mapreduce 函数,但出现意外行为:

我用这个简单的 for 循环填充了我的集合:

for (i=0; i<10000; i++) {db.coll.insert({'a':1,'b':2})}

所以我想计算具有相同“a”值的文档(这是一个测试:-)) 我的地图功能是

map = "function() {  emit(this.a,this.b);}"

而减少是:

reduce = "function (key,values) {return values.length;}"

打电话 db.coll.mapReduce(map, reduce, {out:{inline:1}})

期望值是 10000 个具有相同 'a' 的文档,可以吗?

但结果是:

db.coll.mapReduce(map, reduce, {out:{inline:1}})
{
    "results" : [
            {
                    "_id" : 1,
                    "value" : 101
            }
    ],
    "timeMillis" : 892,
    "counts" : {
            "input" : 10000,
            "emit" : 10000,
            "reduce" : 100,
            "output" : 1
    },
    "ok" : 1,
}

问题出在哪里???为什么值为 101?减少结果中的计数是什么意思? 帮我!提前谢谢!!!

【问题讨论】:

    标签: mongodb map mapreduce reduce


    【解决方案1】:

    这个结果是非常令人期待的,因为您的 reduce 函数实际上并没有做任何归约。

    看看一些基本的 map-reduce 示例HERE,看看 reduce 函数实际上在做什么。它以某种方式组合了每个唯一键的值。你的 reduce 函数没有这样做。

    【讨论】:

    • 你得到 101 的原因可能并不明显,但它实际上是可以预测的,因为 reduce 函数不会为每个键调用一次,每个键都有一个巨大的所有值数组,而是将值分组,然后可以多次调用 reduce 以使用新的值数组重新减少已经减少的值 - 100 个批次将导致最后一次调用时值数组的长度为 101。
    猜你喜欢
    • 2015-03-24
    • 1970-01-01
    • 2018-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-24
    • 2014-12-16
    相关资源
    最近更新 更多