任何人都可以解释map-reduce的概念,特别是在Mongo中?
我也使用C#,因此该领域的任何细节也都很有用.
理解来自C#和LINQ的Map-Reduce的一种方法是将其视为一个SelectMany()
后跟GroupBy()
一个Aggregate()
操作.
在一个SelectMany()
你正在投射一个序列,但每个元素可以成为多个元素.这相当于emit
在地图操作中使用多个语句.map操作也可以选择不调用emit,就像Where()
在你的SelectMany()
操作中有一个子句一样.
在a中,GroupBy()
您正在使用相同的键收集元素,这是Map-Reduce对您从地图操作发出的键值所做的操作.
在Aggregate()
或reduce步骤中,您将获取与每个组键关联的集合,并以某种方式组合它们以为每个键生成一个结果.通常,这种组合只是在地图步骤中为每个键添加一个"1"值输出,但有时它更复杂.
MongoDB map-reduce的一个重要警告是reduce操作必须接受并输出相同的数据类型,因为它可能会重复应用于分组数据的部分集合.如果传递了一个值数组,则不要简单地使用它的长度,因为它可能是早期reduce操作的部分结果.
这里是开始使用Mongo中的Map Reduce的地方.这本食谱有几个例子,我会关注这 两个.
我喜欢在"数据仓库作业"或"汇总"的上下文中考虑map-reduced.您基本上是在获取详细数据并"汇总"该数据的较小版本.
在SQL中,您通常会使用sum()
and avg()
和group by
.在MongoDB中,您可以使用Map Reduce执行此操作.Map Reduce的基本前提是你有两个功能.
第一个函数(map)基本上是一个巨大的for
循环,它运行在你的数据上并"发出"某些键和值.第二个函数(reduce)是对所有发出数据的巨大循环.地图上写着"嘿,这是你想要总结的数据",而减少表示"嘿,这个值的数组减少到这个单一值"
map-reduce的输出可以有多种形式(通常是平面文件).在MongoDB中,输出实际上是一个新集合.
C#细节
在MongoDB中,所有Map Reduce都在javascript引擎内执行.所以map和reduce函数都是用javascript编写的.各种驱动程序将允许您构建javascript并发出命令,但是,这不是我通常这样做的方式.
运行Map Reduce作业的首选方法是将JS编译成文件然后mongo map_reduce.js
.通常,您将在服务器上的某个位置执行此操作作为cron作业或计划任务.
为什么?
好吧,map reduce不是"实时",特别是对于大数据集.它真的设计为批量使用.不要误解我的意思,你可以从你的代码中调用它,但通常,你不希望用户启动map reduce工作.相反,您希望安排这些作业,并希望用户查询结果:)