有人可以在C#中解释map-reduce吗?

时间:2011-01-20 11:45:34

标签: c# mongodb mapreduce

任何人都可以解释map-reduce的概念,特别是在Mongo中吗?

我也使用C#,因此该领域的任何细节都很有用。

3 个答案:

答案 0 :(得分:28)

了解来自C#和LINQ的Map-Reduce的一种方法是将其视为SelectMany(),然后是GroupBy(),后跟Aggregate()操作。

SelectMany()中,您正在投射序列,但每个元素可以成为多个元素。这相当于在 map 操作中使用多个emit语句。 map操作也可以选择不调用emit,就像在Where()操作中有SelectMany()子句一样。

GroupBy()中,您使用相同的键收集元素,这是Map-Reduce对您从 map 操作中发出的键值所做的操作。

Aggregate() reduce 步骤中,您将获取与每个组键关联的集合,并以某种方式将它们组合在一起,为每个键生成一个结果。通常,这种组合只是在地图步骤中为每个键添加一个“1”值输出,但有时它会更复杂。

MongoDB map-reduce的一个重要警告是reduce操作必须接受并输出相同的数据类型,因为它可能会重复应用于分组数据的部分集合。如果传递了一个值数组,不要简单地使用它的长度,因为它可能是早期reduce操作的部分结果。

答案 1 :(得分:14)

Here's a spot开始使用Mongo中的Map Reduce。这本食谱有几个例子,我会关注these two

我喜欢在“数据仓库作业”或​​“汇总”的上下文中考虑map-reduced。您基本上是在获取详细数据并“汇总”该数据的较小版本。

在SQL中,您通常会使用sum()avg()以及group by执行此操作。在MongoDB中,您可以使用Map Reduce执行此操作。 Map Reduce的基本前提是你有两个功能。

第一个函数(map)基本上是一个巨大的for循环,它运行在您的数据上并“发出”某些。第二个函数(reduce)是对所有发出数据的巨大循环。地图上显示“嘿这是你想要汇总的数据”而减少说“嘿,这个数组减少到这个单一值”

map-reduce的输出可以有多种形式(通常是平面文件)。在MongoDB中,输出实际上是一个新集合。

C#Specifics

在MongoDB中,所有Map Reduce都在javascript引擎内执行。所以地图和& reduce函数都是用javascript编写的。各种驱动程序将允许您构建javascript并发出命令,但是,这不是我通常的方式。

运行Map Reduce作业的首选方法是将JS编译成文件然后mongo map_reduce.js。通常,您将在服务器上的某个位置执行此操作作为cron作业或计划任务。

为什么?

嗯,map reduce不是“实时”,特别是对于大数据集。它真的设计为批量使用。不要误解我的意思,你可以从你的代码中调用它,但通常,你不希望用户启动map reduce工作。相反,您希望安排这些作业,并希望用户查询结果:)

答案 2 :(得分:2)

Map Reduce是一种处理数据的方法,其中有一个地图阶段/函数,用于标识要处理的所有数据并逐行处理。

然后你有一个可以多次运行的reduce步骤/函数,例如一个集群中的每个服务器一次,然后在客户端中运行一次以返回最终结果。

这是一篇维基文章,更详细地描述了它:

http://en.wikipedia.org/wiki/MapReduce

这是MongoDB for Mapreduce的文档

http://www.mongodb.org/display/DOCS/MapReduce

简单示例,找到列表中最长的字符串。

地图步骤将循环遍历计算每个字符串长度的列表,reduce步骤将循环遍历map的结果,并且每行保持最长的一个。

这可能会更加复杂,但这就是它的本质。