Mongo DB Map/Reduce - Reduce不被调用

Adi*_*dil 8 javascript reduce mapreduce map mongodb

我试图在Mongo shell中做一个简单的map reduce,但是reduce函数永远不会被调用.这是我的代码:

db.sellers.mapReduce( 
    function(){ emit( this._id, 'Map') } , 
    function(k,vs){ return 'Reduce' }, 
    { out: { inline: 1}})
Run Code Online (Sandbox Code Playgroud)

结果是

{
"results" : [
    {
        "_id" : ObjectId("4da0bdb56bd728c276911e1a"),
        "value" : "Map"
    },
    {
        "_id" : ObjectId("4da0df9a6bd728c276911e1b"),
        "value" : "Map"
    }
],
"timeMillis" : 0,
"counts" : {
    "input" : 2,
    "emit" : 2,
    "output" : 2
},
"ok" : 1,
Run Code Online (Sandbox Code Playgroud)

}

怎么了?

我在Ubuntu 10.10上使用MongoDB 1.8.1 32位

Tom*_*icz 18

ekhem的目的reduce是将与给定键相关联的值集合减少为一个值(聚合结果).如果您只为每个MapReduce键发出一个值,则不需要reduce,所有工作都已完成.但是如果你为给定的两个对发出,则会调用reduce:_id

emit(this._id, 'Map1');
emit(this._id, 'Map2');
Run Code Online (Sandbox Code Playgroud)

这将使用以下参数调用reduce:

reduce(_id, ['Map1', 'Map2'])
Run Code Online (Sandbox Code Playgroud)

_id在过滤数据集时,您更可能希望使用MapReduce键:emit仅当给定记录满足某些条件时才使用.但同样,reduce在这种情况下不会被调用,这是预期的.

  • 仍然可以推断,在仅发出1个项目的情况下,使用您的示例,reduce将接收reduce(_id,['Map1']).不通过reduce会破坏我的结果集. (3认同)
  • 我认为不要在单个值上调用reduce是一个奇怪的实现选择.因此,每当你改变`map`结果的结构时,你也必须调整`reduce`以便在单值"map"结果的情况下得到统一的结果. (3认同)
  • 是的,这是一个真正的痛苦.我正在聚合一个大型数据集,它基本上意味着我不能聚合只包含一个对象的集合.奇怪的实施选择...... (3认同)

San*_*iri 6

好吧,如果只有一个值,MongoDB不会在密钥上调用Reduce函数.

在我看来,这很糟糕.应该留给我的reducer代码来决定是跳过一个奇异值还是对它进行一些操作.

现在,如果我必须对奇异值进行一些操作,我最终会编写finalize函数,并且在finalize中,我尝试区分哪个值已经通过reducer或哪个没有.

我很确定,在Hadoop的情况下不会发生这种情况.