0

这是来自 Couchbase 文档的编码,我不明白

function(key, values, rereduce) {
  var result = {total: 0, count: 0};
  for(i=0; i < values.length; i++) {
    if(rereduce) {
        result.total = result.total + values[i].total;
        result.count = result.count + values[i].count;
    } else {
        result.total = sum(values);
        result.count = values.length;
    }
  }
  return(result);
}
  1. rereduce 表示当前函数调用是否已经完成了reduce。正确的?
  2. reduce函数的第一个参数key,什么时候用呢?我看到了很多例子,key似乎没有使用
  3. rereduce什么时候返回true且数组大小大于1?
  4. 同样,rereduce 何时返回为 false 且数组大小大于 1?
4

2 回答 2

3
  1. Rereduce 意味着之前调用了 reduce 函数,现在再次使用作为第一次 reduce 调用结果返回的参数调用它。因此,如果我们将其分为两个函数,它将如下所示:

    function reduce(k,v){
      // ... doing something with map results
      // instead of returning result we must call rereduce function)
      rereduce(null, result)
    }
    function rereduce(k,v){
      // do something with first reduce result
    }
    

    在大多数情况下,当集群中有 2 个或更多服务器或数据库中有很多项目并且计算是在 B*Tree 的多个“节点”上完成时,会发生 rereduce。带有 2 个服务器的示例将更容易理解:假设您的 map 函数返回对:[key1-1, key2-2, key6-6]来自第 1 个服务器和[key5-5,key7-7]来自第 2 个服务器。您将获得 2 个 reduce 函数调用: reduce([key1,key2,key6],[1,2,6],false)reduce([key5,key7],[5,7],false). 然后,如果我们只是返回值(在 reduce 中什么都不做,只是返回值),reduce 函数将使用这样的参数调用:reduce(null, [[1,2,6],[5,7]], true). 这里的 values 将是来自第一次 reduce 调用的结果数组。

  2. 重新减少键将为空。值将是由先前的 reduce() 函数返回的值数组。

  3. 数组大小仅取决于您的数据。它不依赖于 rereduce 变量。第 4 个问题的答案相同。

您可以尝试从Views basicsViews with reduce中运行示例。即您可以修改reduce函数以查看它在每个步骤中返回的内容:

function reduce(k,v,r){
 if (!r){
   // let reduce function return only one value:
   return 1;
 } else {
   // and lets see what values have came in "rereduce"
   return v; 
 }
}
于 2013-09-24T12:29:15.040 回答
0

我也对来自官方 couchbase 网站的示例感到困惑,以下是我的想法。

混淆:reduce 方法签名

1)它写成 函数(键,值,rereduce)

2) 它写成函数(key, values, rereduce)

第一个参数、键到底是什么

根据我之前关于 map/reduce 的 exp 的所有理解,键是从 map 函数发出的键,并且有一个隐藏的 shuffle 方法可以将值聚合到同一个键的值列表中。因此,在您发出数组作为键的情况下,键参数可以是一个数组(您可以使用分组逐级控制聚合级别)

所以我不同意@m03geek 给出的例子,它不应该是不同键的列表,如果我错了,请纠正我。

我的假设: reduce 和 rereduce 都只在SAME键上工作。

例如:减少就像:

1)reduce(keyA, [1,2,3]) 这是预先计算好的,并存储在Btree结构中

2) rereduce(keyA, [6, reduce(keyA, [4,5,6])]), 6 是第一个reduce方法的[1,2,3]之和,然后我们在couchbase中添加一个新文档,这将再次触发reduce方法,而不是像原始map/reduce那样再次计算整个事情,couchbase从btree中获取预先计算的数据,即6,并从map中的键值对运行reduce方法(通过添加新文档触发),然后对预先计算的值 + 新值运行 re-reduce。

于 2015-03-05T03:39:52.437 回答