0

我以为我有 rethinkdb :) 但现在我有点困惑 - 对于这个查询,计算分组数据:

groupedRql.count()

我得到了预期的结果(数字):

[{"group": "a", "reduction": 41}, {"group": "b", "reduction": 39}...]

所有减少结果都是~40,这是预期的(并且是正确的),但是当我像这样使用 reduce 计数时:

groupedRql.map(function(row) {
  return row.merge({
    count: 0
  })
}).reduce(function(left, right) {
  return {count: left("count").add(1)}
})

我得到的结果要低得多(~10),这毫无意义:

[{"group": "a", "reduction": 10}, {"group": "b", "reduction": 9}...]

当然,我需要使用 reduce 来进行进一步的操作。我错过了什么吗?

我在服务器上使用 v2.0.3,查询直接在 dataexplorer 上测试。

4

1 回答 1

1

问题出在这里

return {count: left("count").add(1)}

它应该是

return {count: left("count").add(right("count"))}

多个分片、多个 CPU 内核之间的 reduce 并行运行。当你这样做

return {count: left("count").add(1)}

你忽略了一些计数right

本文档中指出:https ://www.rethinkdb.com/docs/map-reduce/#how-gmr-queries-are-executed

重要的是要记住,reduce 函数不会对其输入流的元素从左到右调用。它可以按任何顺序在流的元素上调用,也可以在之前对该函数的调用的输出上调用。

于 2015-11-17T18:45:34.783 回答