【问题标题】:Cumulative distribution in MongoDB using MapReduce使用 MapReduce 在 MongoDB 中的累积分布
【发布时间】:2014-11-24 18:03:25
【问题描述】:

我在 mongodb 中有一组文档,我想计算某些属性的 CDF 并将其返回或存储在数据库中。显然,为每个文档添加一个新属性并不是一个好方法,我可以使用以后可以使用的近似值。这更像是一个理论问题。

所以我开始使用 mapreduce 作业计算离散间隔上的 CDF 采样,如下所示(只是算法):

  1. 获取属性someAttrcountminmax
  2. 假设min = 5max=70count = 200
  3. map():for (i=this.someAttr; i < max+1; i++) { emit(i, 1) }
  4. reduce() 中只返回每个键的总和。
  5. finalize() 中,将减少的输出除以记录数:return val / count

不过,这确实会输出包含来自 CDF 的样本的集合..

如您所见,这里的间隔步骤是1,但这种方法的巨大效率低下是即使从单个文档(即使集合中只有少数文档)也会有大量的发射,因此这显然是不可扩展的,并且行不通。

输出如下:

{ _id: 5, val: 0}
{ _id: 6, val: 0.04}
{ _id: 7, val: 0.04}
...
{ _id: 71, val: 1.0}

从这里我可以很容易地得到任何值的 CDF 的近似值,如果合理的话,甚至可以在它们之间进行插值。

有人可以告诉我如何使用 MapReduce(或者可能不使用 MapReduce)计算 CDF(样本)吗?

【问题讨论】:

    标签: mongodb mapreduce cdf


    【解决方案1】:

    根据定义,属性a 的累积分布函数F_a 定义为

    F_a(x) = # documents with attribute value <= x / # of documents
    

    所以你可以用

    计算CDF
    F_a(x) = db.collection.count({ "a" : { "lte" : x }) / db.collection.count({ "a" : { "$exists" : true } })
    

    分母中的计数假设您不想计算缺少a 字段的文档。 a 上的索引会加快速度。

    您可以使用它来计算 cdf 的样本或仅按需计算 cdf。不需要 map-reduce。

    【讨论】:

    • 谢谢,很明显我没有想到 :) 我忘了说我需要整个样本数组,以便在 mapreduce 中进一步使用,所以我基本上不需要'文件的按需 CDF。如果我用它构建数组,你的解决方案当然会好得多,这就是我现在要做的。我仍然想知道,如果数据集太大或者样本需要更精细的间隔,是否可以使用 mapreduce 来完成。我的意思是,mapreduce 方法是否比大量计数更好(假设 MR 中有一个合理的算法)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-14
    • 2013-03-02
    • 1970-01-01
    • 1970-01-01
    • 2019-07-11
    • 2011-03-10
    • 1970-01-01
    相关资源
    最近更新 更多