【问题标题】:error (Reducer: ) when attempting to do distinct reduce尝试执行不同的 reduce 时出现错误(Reducer: )
【发布时间】:2015-07-01 04:30:48
【问题描述】:

我在尝试执行从 here 获得的 DISTINCT 缩减时遇到错误。我已经在啤酒样品桶上重现了这个错误,所以这应该很容易重现。我在mapreduce_errors.txt 文件中没有看到任何错误,或者任何会导致我在其他文件中出现的任何错误。 (如果您希望我搜索或发布其他文件的 sn-ps,请询问)。

在 Windows 2008 R2 上运行 couchbase enterprise 4 beta(这也发生在 3.0.1 社区版上。)。

这是我的地图功能(使用直接与沙发底座一起提供的啤酒样品桶)。

function(doc, meta) {
  switch(doc.type) {
  case "brewery":
    emit(meta.id);
    break;
  }
}

这是我的 reduce 函数:

function(keys, values, rereduce) {
  return keys.filter(function (e, i, arr) {
    return arr.lastIndexOf(e) === i;
  });
}

这是错误:

原因:错误(减速机:)

如果有帮助,还可以提供查看页面的图片:http://i.imgur.com/KyLutMc.png

【问题讨论】:

    标签: couchbase couchbase-view


    【解决方案1】:

    问题在于您的自定义 reduce 函数:当它作为 re-reduce 的一部分被调用时,您没有处理这种情况。

    根据Couchbase documentation

    reduce()函数的基本格式如下:

    function(key, values, rereduce) {
        ...
        return retval;
    }
    

    reduce 函数提供了三个参数:

    key: 键是从 map() 函数派生的唯一键, group_level 参数。

    values: values 参数是一个包含所有匹配值的数组 一个特定的键。例如,如果同一个键被输出了 3 次, 数据将是一个包含三个项目的数组,每个项目 包含由 emit() 函数输出的值。

    rereduce: rereduce 表示函数是否被调用 作为 re-reduce 的一部分,即调用 reduce 函数 再次进一步减少输入数据。

    rereduce 为假时:

    • 提供的 key 参数将是一个数组,其中第一个参数是 map 函数发出的 keyid 是生成密钥的文档 ID。

    • 这些值是一个值数组,其中数组的每个元素都与keys 数组中的相应元素相匹配。

    rereduce 为真时:

    • key 将为空。

    • values 将是由先前的reduce() 函数返回的值数组。该函数应返回简化版本 通过调用 return() 函数获取信息。的格式 返回值应与指定键所需的格式匹配。

    粗体格式是我的,突出显示的单词非常重要:您应该考虑到,有时您会收到 keys 参数,其值为 null

    根据文档,您应该在 reduce() 函数中处理 rereducetrue 的情况,并且您应该知道在这种情况下,keys 将是 null。对于您的 reduce() 函数,您可以执行以下操作:

    function(keys, values, rereduce) {
      if (rereduce) {
        var result = [];
        for (var i = 0; i < values.length; i++) {
          var distinct = values[i];
          for (var j = 0; j < distinct.length; j++) {
            result.push(distinct[j]);
          }
        }
        return result.filter(function (e, i, arr) {
          return arr.lastIndexOf(e) === i;
        });
      }
    
      return keys.filter(function (e, i, arr) {
        return arr.lastIndexOf(e) === i;
      });
    }
    

    在这里,我首先处理重新减少阶段。为此,我将在 values 参数中接收到的数组数组展平,然后删除合并后可能出现的重复项。

    然后是您的原始代码,它返回没有重复的 keys 参数数组。

    为了测试这个reduce() 函数是否真的有效,我使用了以下map() 函数:

    function(doc, meta) {
      switch(doc.type) {
      case "brewery":
        emit(meta.id, null);
        emit(meta.id, null);
        break;
      }
    }
    

    这会故意生成重复项,然后由reduce() 函数删除。

    【讨论】:

    • This made zero change。可以这么说,我尝试发出 meta.id 作为键和值; null 和文档作为键/值,以及两者的组合,以及修改 reduce 函数以使用键/值。都导致了同样的错误。
    • 就像我在问题中提到的,这个错误也发生在 3.0.1 社区版中。
    • Here 是我现在得到的输出(我现在正在使用我的存储桶)。我现在在my reduce function 中得到重复。
    • 好吧,你已经赢得了复选标记和赏金。如果您最终发现是否有日志记录功能,您可以回帖吗?我现在真的很好奇...
    • @FrankerZ Couchbase 论坛大约在 2015 年:Call log("...") to log a message from a map function.forums.couchbase.com/t/…
    【解决方案2】:

    虽然此 reduce 可用作开发视图,但不能用作生产视图。数据集必须太大,因此您必须实施 rereduce。该文档应该有助于http://docs.couchbase.com/admin/admin/Views/views-writing.html#reduce-functions

    【讨论】:

    • 这也不起作用,我正在使用示例数据集。不可能这么大吧?
    • 开发视图应该针对一个小数据集运行,所以我
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-26
    • 2020-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-21
    • 2021-09-13
    相关资源
    最近更新 更多