Mapreduce 可以减少错误吗?
我在CouchDB中有一个样本数据库,其中包含许多飞机的信息,还有一个视图,其中制造商是关键,模型是值 map函数是Mapreduce 可以减少错误吗?,mapreduce,couchdb,couchdb-futon,Mapreduce,Couchdb,Couchdb Futon,我在CouchDB中有一个样本数据库,其中包含许多飞机的信息,还有一个视图,其中制造商是关键,模型是值 map函数是 function(doc) { emit(doc["Manufacturer"], doc._id) } function(keys, values, rereduce){ return values.length; } 并且reduce函数是 function(doc) { emit(doc["Manufacturer"], doc._id) }
function(doc) {
emit(doc["Manufacturer"], doc._id)
}
function(keys, values, rereduce){
return values.length;
}
并且reduce函数是
function(doc) {
emit(doc["Manufacturer"], doc._id)
}
function(keys, values, rereduce){
return values.length;
}
这很简单。当我用Futon显示视图时,我确实得到了正确的结果,我有26架波音飞机:
"BOEING" 26
但是如果我使用REST客户机使用
http://localhost:6060/aircrafts/_design/basic/_view/VendorProducts?key="BOEING"
我明白了
我已经测试了不同的客户端(包括web浏览器、REST客户端扩展和curl),所有这些都给了我值2!而使用其他键的查询工作正常
MapReduce函数或我的查询是否有问题?您似乎陷入了
重新还原的陷阱。严格来说,Couchdb使用map reduce reduce进程
- 映射:以输出格式重新格式化数据
- Reduce:聚合多个(但不是所有具有相同密钥的条目)的数据,这在您的情况下是正确的李>
- Re reduce:与reduce相同,但基于先前缩减的数据李>
当您在reduce阶段更改值的格式时,re reduce调用将聚合已经减少的值的数量
解决方案:
您只需将贴图中的值设置为1并减少值的总和李>
检查rereduce==true
,在这种情况下,返回一个值的总和-这将是初始reduce返回的整数值李>
问题可能是因为分组
使用group=true(这是Futon的默认值),可以为地图中的每个唯一键获得一个单独的reduce值——也就是说,共享同一个键的所有值都被分组在一起并减少为一个值
使用curl等进行查询时,是否将group=true
作为查询参数传递?因为它在futon中默认通过,所以您看到的结果如下
波音:26
其中as withoutgroup=true
仅返回减少的值
所以试试这个查询
http://localhost:6060/aircrafts/_design/basic/_view/VendorProducts?key=“波音”&集团=真
谢谢!这确实是我需要的。我对CouchDB很陌生,有些事情我没有注意到。使用group=true
也解决了null
键的问题,在这种情况下,尽管值是正确的,但键始终是null
。但现在我想知道,为什么我们需要group
和reduce
两个参数?在这种情况下,只有reduce
有用吗???区别在于group
和group\u level
为每组唯一键运行reduce,其中as reduce将结果减少为单个值。因此,如果您有另一个制造商,如ACME
,上述查询将返回结果BOEING:26,ACME:1
,其中as reduce将返回27
。所以分组就像在关键点上运行多个reduces。顺便说一句,我希望你喜欢couchdb:)再次感谢!我尝试了一些有组和没有组的东西,我想现在我对它有了更多的了解。但是,当键包含“BOEING”和group=false
(始终为2)时,我仍然得到一个奇怪的结果,而其他结果是正确的。当group=true
时,结果也是正确的。也许我的医生有问题?顺便说一句,我使用的是CouchDB 1.5,这可能是1.6中已经修复的错误吗?(由于一些未知的原因,我没有成功地使1.6在我的Windows7上工作)。我很喜欢CouchDB,我想深入了解它!谢谢我尝试了你提到的,虽然我100%同意你,但结果几乎是一样的。如果我使用你的解决方案,我将得到26架波音飞机,无论我是否使用组
,但所有其他飞机都是一样的!也就是说,无论我是否使用组
,我都会得到相同数量的飞机。真奇怪!不过,我还是100%同意你的解决方案,我会记住这一点!