Equivalentes a Linq de Map and Reduce: Se você tiver a sorte de ter linq, não precisará escrever seu próprio mapa e reduzir as funções. O C # 3.5 e o Linq já o possuem, embora com nomes diferentes.
A tradução está correta, mas perde um ponto-chave. A etapa de reprodução aleatória na redução de mapa é crítica na redução de mapa, mas não aparece no nome e não é necessário escrever nenhum código para ela. Ele é direcionado exclusivamente pela chave extraída na etapa do mapa. A resposta de Joel Martinez destaca isso na minha opinião melhor.
Por que oh por que eles não apenas chamá-lo Reduce, em vez de Aggregate... MS só gosta de programadores irrite
John Henckel
13
@ JohnHenckel, definitivamente não sou uma fonte autorizada, mas tenho certeza de que isso vem do SQL. Acredito que o linq foi originalmente comprado como uma maneira de facilitar a interação com o sql em c #. Quando você está nomeando funções nesse mundo, o agregado começa a parecer um pouco mais familiar do que "reduzir" quando comparado a itens como Selecionar e Agrupar por. Não estou dizendo que está certo, isso me irrita sem fim, mas imagino que seja a razão disso.
Elliot Blackburn
18
As classes de problemas que são adequadas para uma solução no estilo mapreduce são problemas de agregação. De extração de dados de um conjunto de dados. Em C #, pode-se tirar proveito do LINQ para programar nesse estilo.
o método GroupBy está atuando como o mapa, enquanto o método Select faz o trabalho de reduzir os resultados intermediários na 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);
Desde que eu nunca pode lembrar que LINQ chama isso Where, Selecte Aggregateem vez de Filter, Mape Reduceentão eu criei alguns métodos de extensão que você pode usar:
IEnumerable<string> myStrings =newList<string>(){"1","2","3","4","5"};IEnumerable<int> convertedToInts = myStrings.Map(s =>int.Parse(s));IEnumerable<int> filteredInts = convertedToInts.Filter(i => i <=3);// Keep 1,2,3int sumOfAllInts = filteredInts.Reduce((sum, i)=> sum + i);// Sum up all intsAssert.Equal(6, sumOfAllInts);// 1+2+3 is 6
Respostas:
Equivalentes a Linq de Map and Reduce: Se você tiver a sorte de ter linq, não precisará escrever seu próprio mapa e reduzir as funções. O C # 3.5 e o Linq já o possuem, embora com nomes diferentes.
O mapa é
Select
:Reduzir é
Aggregate
:O filtro é
Where
:https://www.justinshield.com/2011/06/mapreduce-in-c/
fonte
Reduce
, em vez deAggregate
... MS só gosta de programadores irriteAs classes de problemas que são adequadas para uma solução no estilo mapreduce são problemas de agregação. De extração de dados de um conjunto de dados. Em C #, pode-se tirar proveito do LINQ para programar nesse estilo.
Do seguinte artigo: http://codecube.net/2009/02/mapreduce-in-c-using-linq/
Para a parte distribuída, você pode conferir o DryadLINQ: http://research.microsoft.com/en-us/projects/dryadlinq/default.aspx
fonte
Desde que eu nunca pode lembrar que LINQ chama isso
Where
,Select
eAggregate
em vez deFilter
,Map
eReduce
então eu criei alguns métodos de extensão que você pode usar:Aqui estão os três métodos (em https://github.com/cs-util-com/cscore/blob/master/CsCore/PlainNetClassLib/src/Plugins/CsCore/com/csutil/collections/IEnumerableExtensions.cs ):
Mais alguns detalhes em https://github.com/cs-util-com/cscore#ienumerable-extensions :
fonte