【问题标题】:Why do CouchDB reduce functions receive 'keys' as an argument为什么 CouchDB reduce 函数接收“键”作为参数
【发布时间】:2018-03-24 06:00:25
【问题描述】:

使用 CouchDB 缩减功能:

function(keys, values, rereduce) {
  // ...
}

这样调用:

reduce(  [[key1,id1], [key2,id2], [key3,id3]],    [value1,value2,value3],   false   ) 

问题 1

将键传递给reduce函数的原因是什么?我只用reduce函数编写了相对简单的CouchDB视图,想知道接收[key1, docid], [key2, docid], etc列表的用例是什么。

还有。有没有时候key1 != key2 != keyX 执行reduce 函数?

问题 2

CouchDB 的 MapReduce 实现允许rereduce=true,在这种情况下,reduce 函数的调用方式如下:

reduce(null,  [intermediate1,intermediate2,intermediate3],  true)

keys 参数是null(与rereduce=false 不同)。如果rereduce=false 有用处,为什么在这种情况下没有keys 参数的用例?

【问题讨论】:

    标签: mapreduce couchdb


    【解决方案1】:

    rereduce = truekeys参数的用例是什么?

    没有。这就是为什么keys 参数在这种情况下为空。

    来自the documentation(已添加重点):

    Reduce 和 Rereduce 函数

    redfun(keys, values[, rereduce])

    参数:

    • keys – 相关映射函数结果的 docid-key 对数组。 如果 rereduce 正在运行,则始终为 null(具有真实值)。
    • values – 映射函数结果值数组。
    • rereduce – 布尔标志,表示重新减少运行。

    也许您要问的是:为什么reducerereduce 使用相同的函数?我预计其中涉及一些历史,但我也可以想象这是因为相同的逻辑可以用于两个函数是很常见的,并且通过没有单独的函数定义可以减少重复。假设一个简单的sum reduce 函数:

    function(keys, values) {
        return sum(values);
    }
    

    这里keysrereduce 都可以完全忽略。许多其他 (re)reduce 函数遵循相同的模式。如果必须使用两个函数,则必须指定两次相同的函数。


    针对cmets中的附加问题:

    rereduce=false 时,keys 参数存在哪些用例?

    请记住,keysvalues 可以是任何东西,具体取决于地图功能。一个常见的模式是emit([foo,bar,baz],null)。也就是说,如果您关心的所有数据都已经存在于键中,则该值可能为空。在这种情况下,任何比简单的 sum 更复杂的 reduce 函数都需要使用键。

    此外,对于分组操作,使用键是有意义的。考虑一个带有 emit(doc.countryCode, ... ) 的 map 函数,一个可能的(不完整的)reduce 函数:

    function(keys, values, rereduce) {
        var sums = {},
        if !rereduce {
            for (var i = 0; i < keys.length; i++) {
                sums[keys[i]]++;
            }
        }
        return sums;
    }
    

    然后给出文件:

    • {"countryCode": "us", ...}
    • {"countryCode": "us", ...}
    • {"countryCode": "br", ...}

    您将获得以下发射值(来自 map 函数):

    • ["us", ...]
    • ["br", ...]

    您会减少以下结果:

    {"us": 2, "br": 1}

    【讨论】:

    • 我实际上没有考虑到键没有传递给 rereduce 函数,并且将 reduce=true 拼错为 rereduce=true。但回想起来,这个错误提出了一个很好的问题:p。感谢您的回答;当reduce=true 时,您还能够回答keys 参数存在哪些用例吗? (但rereduce=false)?如果这不是一个简短的答案,我会在 SO 上重新发布。
    • 没有变量reduce;当rereduce 不正确时,该状态只是隐含的。这是你的意思吗?无论如何,我用更多细节更新了答案。
    • 再次感谢您!我编辑了问题以包含上述评论中提到的更多信息。就reduce=true 而言,我指的是CouchDB API。即您可以像这样调用 MapReduce 索引:.../_design/doc/_view/someView?group=true&amp;reduce=true。即您可以拨打reduce=false
    • @ZachSmith:嗯,对。不过,该变量与 reduce 函数的运行无关;只是检索已经计算过的数据。
    • 还有一个专门针对沙发的问题:键列表实际上是一个元组列表( (key, docId), (key, docId), etc ,... )。接收 docId 和密钥的用例是什么?
    猜你喜欢
    • 2013-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-18
    • 2015-10-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-27
    相关资源
    最近更新 更多