用于计算参数值的MapReduce
我有这样的文件:用于计算参数值的MapReduce,map,mapreduce,reduce,mongodb,Map,Mapreduce,Reduce,Mongodb,我有这样的文件: { "_id": ObjectId("4d17c7963ffcf60c1100002f"), "title": "Text", "params": { "brand": "BMW", "model": "i3" } } { "_id": ObjectId("4d17c7963ffcf60c1100002f"), "title": "Text", "params": { "brand": "BMW",
{
"_id": ObjectId("4d17c7963ffcf60c1100002f"),
"title": "Text",
"params": {
"brand": "BMW",
"model": "i3"
}
}
{
"_id": ObjectId("4d17c7963ffcf60c1100002f"),
"title": "Text",
"params": {
"brand": "BMW",
"model": "i5"
}
}
{ key : { 'brand' : 'bmw' }, value : 2 }
{ key : { 'model' : 'i5' }, value : 1 }
我需要的是每个参数值的计数。比如:
brand
---------
BMW (2)
model
---------
i3 (1)
i5 (1)
我想我必须编写map/reduce函数。我该怎么做?谢谢。在映射函数中,枚举
此
对象的params属性的属性。对于找到的每个属性,使用包含属性名称和属性值的键调用emit
。将1作为值传递。e、 g.emit({'brand','BMW',1)
但显然使用变量而不是常量
在reduce函数中,会向您传递一个键和一个值数组。对这些值求和并返回总和。即使初始数组都是1,也不要尝试使用数组的长度,因为reduce函数可以迭代调用
之后,您可以从结果集合中对结果进行分组,如果性能需要,可以应用索引
我想我必须编写map/reduce函数
是的,你需要一张地图。有关一些简单的map reduce示例,请参阅
对于您的特定情况,您首先需要更改对输出的期望。map/reduce的输出是一个集合。该系列(在您的案例中)的外观如下:
{
"_id": ObjectId("4d17c7963ffcf60c1100002f"),
"title": "Text",
"params": {
"brand": "BMW",
"model": "i3"
}
}
{
"_id": ObjectId("4d17c7963ffcf60c1100002f"),
"title": "Text",
"params": {
"brand": "BMW",
"model": "i5"
}
}
{ key : { 'brand' : 'bmw' }, value : 2 }
{ key : { 'model' : 'i5' }, value : 1 }
要生成此集合,您需要一个“映射”函数和一个“减少”函数。“映射”函数将发出一个键和一个值。键是params的每个元素,值是1的计数。“reduce”函数接受一个键和一个值数组,只返回一个值。您的问题与下面的示例基本相同:
不同参数的集合是小的、有限的和已知的吗?不,它们不是。盖茨副总裁的解决方案奏效了。谢谢