【发布时间】:2014-02-28 02:04:01
【问题描述】:
我正在尝试使用 Map/Reduce 将部分合并到现有集合中。我的 MR 工作正常,但无法返回合并的结果。
以下是输出类型为缩减的 MR 的统计数据:
{
"result" : "calculation",
"timeMillis" : 222,
"counts" : {
"input" : 492,
"emit" : 920,
"reduce" : 64,
"output" : 435078
},
"ok" : 1.0
}
我希望输出是实际合并的文档数,而不是整个集合。有没有办法做到这一点?
我尝试将 modified:true 标志合并到目标文档中。这样可以进行查询,只返回在目标集合中修改的文档。查询后,我将 flag 设置回 false。
虽然这可以正常工作,但由于进行了大量更改然后又翻转回来,它开始破坏索引,因此 HD 速率猛增而 MR 性能下降。
理想情况下,从 C# 驱动程序调用 result.GetResults() 会自然地返回 MR 修改的文档,而无需使用标志。
更新:
具体来说,我有一个“只写”集合,MR 在其上运行以合并到“读取”集合中。
如果有一个像这样的文档集
{
"_id":BsonId,
"key":"key1",
"valarray":["one"],
},
{
"_id":BsonId
"key":"key2"
"valarray":["one"]
}
然后 MR 进入空白查询集合会产生
{
"_id":"key1",
"value":
{
"valarray":["one"]
}
},
{
"_id":"key2",
"value":
{
"valarray":["one"]
}
}
我希望计数是:输入 = 2,发射 = 2,减少 = 0,输出 = 2
如果有一个新文档插入到写入集合中
{
"_id":BsonId,
"key":"key1",
"valarray":["two"],
}
那么 map-reduce 集合就是
{
"_id":"key1",
"value":
{
"valarray":["one", "two"]
}
},
{
"_id":"key2",
"value":
{
"valarray":["one"]
}
}
然后计数是:输入 = 1,发射 = 1,减少 = 1,输出 = 2
通过 C# 驱动程序,调用 result.GetResults() 将遍历整个目标集合。问题是我不想遍历集合,我只想遍历目标集合中由 MR 修改的文档。在这种情况下,它应该返回 "_id":"key1" 而不是 "_id":"key2"。
【问题讨论】:
-
那么您的问题到底是什么?也许您可以展示您尝试解决的问题、您的 mapReduce 代码以及您尝试使用的不同文档的示例。
-
谢谢,更新够了吗?
-
它确实显示了你想去的地方。但是只有代码显示了你是如何到达那里的以及它在哪里不足。但猜测一下,您目前无法知道哪些项目实际上在您的目标中,以确定要更新或插入的内容。
-
是的,在文档下,它说reduce的选项是“如果输出集合已经存在,则将新结果与现有结果合并。如果现有文档与新结果具有相同的键,将reduce函数应用于新文档和现有文档,并用结果覆盖现有文档。”我认为从 MR 返回的结果应该代表合并的文档,而不是整个集合。这绝对是一个核心的实现问题。
-
好吧,是否要发布代码取决于您。但是,除非您这样做,否则我看不到人们如何看到这超出了您的期望。毕竟这是问题的一部分。