尝试执行从here获得的DISTINCT减少时出错。我在啤酒样品桶上重现了这个错误,所以这应该很容易重现。我没有在#include <vector>
#include <iostream>
#include <algorithm>
void print(const std::vector<int> & v) {
std::cout<<"(";
for(auto x=v.begin(); x!=v.end(); ++x) {
std::cout<<*x<<",";
}
std::cout<<")";
}
void print(const std::vector<std::vector<int>> & v) {
std::cout<<"(";
for(auto x=v.begin(); x!=v.end(); ++x) {
print(*x);
std::cout<<",";
}
std::cout<<")"<<std::endl;
}
int main() {
std::vector<std::vector<int>> v {
{0,100,17,2},
{2,3,1,3},
{9,92,81,8},
{0,92,92,91},
{0,92,92,91},
{10,83,7,2},
{1,2,3,3}
};
print(v);
std::sort(v.begin(), v.end());
print(v);
std::vector<int> key = { 0,100, 17, 2 };
auto it = std::lower_bound(v.begin(), v.end(), key);
if(it!=v.end() && key==*it) {
std::cout<<"Found it"<<std::endl;
} else {
std::cout<<"Not found"<<std::endl;
}
}
文件中看到任何错误,也没有看到任何会导致我在其他文件中的错误。 (如果您希望我搜索或发布其他文件的片段,请询问)。
在Windows 2008 R2上运行couchbase enterprise 4 beta(这也发生在3.0.1社区版本上。)。
这是我的地图功能(使用啤酒样本桶,直接与couchbase一起发货)。
mapreduce_errors.txt
这是我的reduce函数:
function(doc, meta) {
switch(doc.type) {
case "brewery":
emit(meta.id);
break;
}
}
这是错误:
原因:错误(减速机:)
如果它有帮助,也是视图页面的一部分:http://i.imgur.com/KyLutMc.png
答案 0 :(得分:1)
问题出在你的自定义缩减功能中:当你作为重新缩减的一部分被调用时,你没有处理这种情况。
reduce()函数的基本格式如下:
function(key, values, rereduce) { ... return retval; }
reduce函数提供了三个参数:
key
:关键是从map()函数派生的唯一键 group_level参数。
values
:values参数是所有匹配值的数组 特别的关键。例如,如果相同的键输出三次, 数据将是包含每个项目的三个项目的数组 包含emit()函数输出的值。
rereduce
:rereduce表示是否正在调用该函数 作为重新减少的一部分,即调用reduce函数 再次进一步减少输入数据。当
rereduce
为假时:
提供的
key
参数将是一个数组,其中第一个参数是map函数发出的key
,id
是生成的keys
文档ID键。值是一个值数组,其中数组的每个元素与
rereduce
数组中的对应元素匹配。当
key
为真时:
values
将为空。
reduce()
将是前一个keys
函数返回的值数组。该函数应返回简化版本 通过调用return()函数来获取信息。格式 返回值应与指定键所需的格式匹配。
大胆的格式是我的,突出显示的单词非常重要:您应该考虑有时候,您会收到值为null
的{{1}}参数。
根据文档,您应该在rereduce
函数中true
为reduce()
时处理此案例,并且您应该知道在这种情况下,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()
函数删除。
答案 1 :(得分:0)
虽然此reduce用作开发视图,但它不作为生产视图。数据集必须太大,因此您必须实施rereduce。该文档应该有助于http://docs.couchbase.com/admin/admin/Views/views-writing.html#reduce-functions