Mapear y reducir en .NET
¿Qué escenarios justificarían el uso del algoritmo " Mapear y Reducir "?
¿Existe una implementación .NET de este algoritmo?
Equivalentes de Linq de Map y Reduce: si tienes la suerte de tener linq, entonces no necesitas escribir tu propio mapa y funciones de reducción. C# 3.5 y Linq ya lo tienen, aunque con nombres diferentes.
El mapa es
Select
:Enumerable.Range(1, 10).Select(x => x + 2);
Reducir es
Aggregate
:Enumerable.Range(1, 10).Aggregate(0, (acc, x) => acc + x);
El filtro es
Where
:Enumerable.Range(1, 10).Where(x => x % 2 == 0);
https://www.justinshield.com/2011/06/mapreduce-in-c/
Las clases de problemas que se adaptan bien a una solución de estilo mapreduce son problemas de agregación. De extraer datos de un conjunto de datos. En C#, se podría aprovechar LINQ para programar con este estilo.
Del siguiente artículo: http://codecube.net/2009/02/mapreduce-in-c-using-linq/
el método GroupBy actúa como mapa, mientras que el método Select hace el trabajo de reducir los resultados intermedios a la lista final de resultados.
var wordOccurrences = words
.GroupBy(w => w)
.Select(intermediate => new
{
Word = intermediate.Key,
Frequency = intermediate.Sum(w => 1)
})
.Where(w => w.Frequency > 10)
.OrderBy(w => w.Frequency);
Para la parte distribuida, puede consultar DryadLINQ: http://research.microsoft.com/en-us/projects/dryadlinq/default.aspx