为什么CouchDB默认启用reduce_limit? (在MapReduce视图或列表视图中近似SQL JOINS会更好吗?)

时间:2016-06-25 07:28:01

标签: list mapreduce couchdb

我使用的是CouchDB,我想在查询数据时更好地利用MapReduce。

我的确切用例如下:

我有很多调查。每个调查都有一个meterNumber,meterReading和meterReadingDate,例如:

{
  meterNumber: 1,
  meterReading: 2050,
  meterReadingDate: 1480000000000
}

然后我使用Map函数来生成meterNumber的读数。有许多键重复(在不同日期读取相同的仪表)。即。

[
  [meterNumber, {reading: xxx, readingDate: xxx}],
  [meterNumber, {reading: xxx, readingDate: xxx}],
  [meterNumber, {reading: xxx, readingDate: xxx}],
  etc
]

然后我在发送到reduce函数之前对这些进行分组,然后reduce函数应该实际扩展设置的值。即我想要这个:

[
  [meterNumber, [{reading:xxx, readingDate: xxx}, {reading:xxx, readingDate: xxx}, {reading:xxx, readingDate: xxx}]],
  [meterNumber, [{reading:xxx, readingDate: xxx}, {reading:xxx, readingDate: xxx}, {reading:xxx, readingDate: xxx}]],
  [meterNumber, [{reading:xxx, readingDate: xxx}, {reading:xxx, readingDate: xxx}, {reading:xxx, readingDate: xxx}]],
  etc
]

要在CouchDB上运行此MapReduce视图,我必须允许这种类型的结果集(Couchdb - Is it possible to deactivate the reduce_overflow_error error)。

这告诉我,我可能遇到大型结果集的性能问题。是这样的吗?为什么要在CouchDB上专门启用此设置?

***编辑

下面接受的答案向我指出,我在MapReduce中所做的事情也可能(并且更好)使用列表。这是关于同一主题的另一个很好的Stack Overflow答案:Best way to do one-to-many "JOIN" in CouchDB

***编辑

以下是CouchDB文档的参考:http://guide.couchdb.org/draft/transforming.html

1 个答案:

答案 0 :(得分:3)

reduce函数旨在 reduce 与给定键相关联的值。

CouchDB reduce_limit用于检测设计糟糕的reduce函数,这是你通过连接值所做的...但不要惊慌:CouchDB中的任何新手都会做同样的错误。

reduce函数中连接值的问题是:

  1. 完全没必要(如果你需要整个列表,只需使用一个map函数),
  2. 非常效率不高:您的索引在磁盘上会变得越来越大,并且您将拥有越来越多的磁盘访问时间。
  3. 所以......只需编写一个最小map函数,例如:

    function(o){
      emit(o.meterNumber);
    }
    

    不要写任何reduce函数。并使用include_docs=true调用该视图。

    但也许您对数据格式不满意? 没问题:你有list个功能。请记住,mapreduce函数应该用于纯数据处理,而不是用于格式化目的。