【问题标题】:Calculate average using mapreduce in MongoDb在 MongoDb 中使用 mapreduce 计算平均值
【发布时间】:2017-07-18 15:05:16
【问题描述】:

我收集了 1000 万条类似的记录。

{
    "_id" : ObjectId("596dd10bbd1a6628ace1c14c"),
    "X" : 13212,
    "Z" : 173836,
    "userID" : 9354785
}

用户 ID 是唯一的。我必须计算 X 的平均值和 Z 的总和。我可以使用以下 mapReduce 函数计算 Z 的总和

var mapFunction1 = function() {
emit(this.userID, this.Z);
};

var reduceFunction1 = function() {
return Array.sum(Z);
};

db.transaction.mapReduce(
mapfunction1, 
reduceFunction1,
{out:"mapreduce"}
)

如何计算 X 的平均值?

我尝试了 Array.avg(Z),但它返回的输出与 sum(Z) 相同。

【问题讨论】:

  • 标题是“Hadoop” MapReduce,但这个例子看起来像一个 MongoDB MapReduce。你能澄清一下这个问题吗?是否涉及 Hadoop,或者这是 MongoDB 的问题?

标签: mongodb mapreduce


【解决方案1】:

看起来可以使用Aggregation Pipeline$avg$sum 运算符更简单地表达需求。

输入

> db.transactions.find()
{ "_id" : ObjectId("5970e59e26507421fa20bee9"), "X" : 13212, "Z" : 173836, "userID" : 9354785 }
{ "_id" : ObjectId("5970e5a426507421fa20beea"), "X" : 1234, "Z" : 5678, "userID" : 1 }
{ "_id" : ObjectId("5970e5a826507421fa20beeb"), "X" : 100, "Z" : 200, "userID" : 2 }

聚合管道

> db.transactions.aggregate([
    {
        $group : {
            _id: "aggregates",
            avgX: {
                $avg: "$X"
            },
            sumZ: {
                $sum: "$Z"
            }
        }
    }
])

输出

{ "_id" : "aggregates", "avgX" : 4848.666666666667, "sumZ" : 179714 }

【讨论】:

    【解决方案2】:

    您没有将 (key,value) 对参数传递给 reduceFunction1。 试试这个:

    var mapFunction1 = function() {
    emit(this.userID, this.Z);
    };
    
    var reduceFunction1 = function(varKey,varZ) {
    return Array.avg(varZ);
    };
    
    db.transaction.mapReduce(
    mapfunction1, 
    reduceFunction1,
    {out:"mapreduce"}
    )
    

    【讨论】:

      猜你喜欢
      • 2014-07-19
      • 2020-06-01
      • 2018-08-15
      • 2012-10-11
      • 2014-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多