Mapreduce 为什么CouchDB reduce函数接收';钥匙';作为论据

Mapreduce 为什么CouchDB reduce函数接收';钥匙';作为论据,mapreduce,couchdb,Mapreduce,Couchdb,使用CouchDB reduce功能: function(keys, values, rereduce) { // ... } function(keys, values) { return sum(values); } function(keys, values, rereduce) { var sums = {}, if !rereduce { for (var i = 0; i < keys.length; i++) {

使用CouchDB reduce功能:

function(keys, values, rereduce) {
  // ...
}
function(keys, values) {
    return sum(values);
}
function(keys, values, rereduce) {
    var sums = {},
    if !rereduce {
        for (var i = 0; i < keys.length; i++) {
            sums[keys[i]]++;
        }
    }
    return sums;
}
这被称为:

reduce(  [[key1,id1], [key2,id2], [key3,id3]],    [value1,value2,value3],   false   ) 
reduce(null,  [intermediate1,intermediate2,intermediate3],  true)
问题1

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

还有。是否曾经有过
key1!=键2!=keyX
何时执行reduce函数

问题2

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

reduce(  [[key1,id1], [key2,id2], [key3,id3]],    [value1,value2,value3],   false   ) 
reduce(null,  [intermediate1,intermediate2,intermediate3],  true)
其中keys参数为
null
(不同于
rereduce=false
)。如果使用when
rereduce=false
,为什么在这种情况下没有
keys
参数的用例

rereduce=true
时,
参数的用例是什么

没有。这就是为什么在本例中,
keys
参数为空

起自(加强调):

减少和减少函数 redfun(键、值[,重导出])

论据:
  • –用于相关地图功能结果的成对docid键数组如果rereduce正在运行,则始终为空(具有真值)。
  • –映射函数结果值数组
  • rereduce
    –用于指示rereduce运行的布尔标志
也许你想问的是:为什么
reduce
reduce
都使用相同的函数?我希望会涉及到一些历史,但我也可以想象,这是因为两个函数都可以使用相同的逻辑是很常见的,通过没有单独的函数定义,可以减少重复。假设一个简单的
sum
reduce函数:

function(keys, values, rereduce) {
  // ...
}
function(keys, values) {
    return sum(values);
}
function(keys, values, rereduce) {
    var sums = {},
    if !rereduce {
        for (var i = 0; i < keys.length; i++) {
            sums[keys[i]]++;
        }
    }
    return sums;
}
这里可以完全忽略
返回键
。许多其他(重新)reduce函数遵循相同的模式。如果必须使用两个函数,那么这个相同的函数必须指定两次


针对评论中的补充问题:

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

请记住,
可以是任何值,具体取决于map函数。常见的模式是
发出([foo,bar,baz],null)
。也就是说,如果您关心的所有数据都已存在于密钥中,则该值可能为null。在这种情况下,任何比简单的求和更复杂的reduce函数都需要使用键

此外,对于分组操作,使用键是有意义的。考虑一个映射函数,使用<代码> EIT(DOC .ChanCal码,…)< /C>,一个可能的(不完整)的缩减函数:

function(keys, values, rereduce) {
  // ...
}
function(keys, values) {
    return sum(values);
}
function(keys, values, rereduce) {
    var sums = {},
    if !rereduce {
        for (var i = 0; i < keys.length; i++) {
            sums[keys[i]]++;
        }
    }
    return sums;
}
函数(键、值、返回值){
变量和={},
如果!再减少{
对于(变量i=0;i
然后给出文件:

  • {“countryCode”:“美国”,…}
  • {“countryCode”:“美国”,…}
  • {“countryCode”:“br”,…}
您将(从map函数)获得以下值:

  • [“美国”,…]
  • [“br”,…]
您可能会减少以下结果:


{“us”:2,“br”:1}

我实际上没有考虑到键没有传递给REREREDUCE函数,并且将
reduce=true
拼写为
REREREREDUCE=true
。但回想起来,这个错误引出了一个很好的问题:p。谢谢你的回答;当
reduce=true
时,您是否能够回答keys参数存在哪些用例?(但是
rereduce=false
)?如果这不是一个简短的答案,我会重新发布。没有变量
reduce
;当
rereduce
不为真时,该状态就是隐式的。这就是你的意思吗?不管怎样,我更新了一些细节的答案。再次感谢你!我对问题进行了编辑,以包括上述评论中提到的更多信息。关于
reduce=true
,我指的是CouchDB API。i、 e.您可以这样调用MapReduce索引:
../\u design/doc/\u view/someView?group=true&reduce=true
。i、 e.你可以用
reduce=false
@ZachSmith:啊,对了。不过,该变量与reduce函数的运行无关;仅检索已计算的数据。还有一个专门针对Coach的问题:键列表实际上是元组列表
((键,docId),(键,docId)等)
。接收docId和密钥的用例是什么?