Может кто-нибудь объяснить карту-уменьшить в C #? - PullRequest
16 голосов
/ 20 января 2011

Кто-нибудь может объяснить, пожалуйста, концепцию карты-редукции, особенно в Mongo?

Я также использую C #, поэтому любая специфика в этой области также будет полезна.

Ответы [ 3 ]

28 голосов
/ 21 января 2011

Один из способов понять Map-Reduce, исходящий из C # и LINQ, состоит в том, чтобы думать о нем как о SelectMany(), за которым следует GroupBy(), за которым следует операция Aggregate().

В SelectMany() вы проецируете последовательность, но каждый элемент может стать несколькими элементами. Это эквивалентно использованию нескольких операторов emit в вашей операции map . Операция map также может не вызывать emit, как если бы в вашей операции SelectMany() было предложение Where().

В GroupBy() вы собираете элементы с тем же ключом, который Map-Reduce делает со значением ключа, которое вы излучаете из операции map .

На шаге Aggregate() или уменьшение вы берете коллекции, связанные с каждым ключом группы, и комбинируете их некоторым образом, чтобы получить один результат для каждого ключа. Часто эта комбинация просто складывает одно значение «1» с каждым ключом из шага карты, но иногда это сложнее.

Одно важное предостережение, связанное с MongoDB map-Reduce, заключается в том, что операция Reduce должна принимать и выводить один и тот же тип данных, поскольку его можно применять повторно к частичным наборам сгруппированных данных. Если вам передан массив значений, не просто указывайте его длину, поскольку он может быть частичным результатом более ранней операции сокращения.

14 голосов
/ 20 января 2011

Вот место , чтобы начать работу с Map Reduce в Монго.В кулинарной книге есть несколько примеров, я бы остановился на этих двух .

. Мне нравится думать о сокращении карты в контексте "заданий хранилища данных" или«накопительные».В основном вы берете подробные данные и «свернете» уменьшенную версию этих данных.

В SQL вы обычно делаете это с sum() и avg() и group by.В MongoDB вы могли бы сделать это с помощью Map Reduce.Основная предпосылка Map Reduce состоит в том, что у вас есть две функции.

Первая функция (map) - это гигантский цикл for, который работает над вашими данными и «излучает» определенные клавиши и значения .Вторая функция (уменьшение) - это гигантский цикл по всем передаваемым данным.На карте написано «эй, это данные, которые вы хотите обобщить» , а сокращение говорит «эй, этот массив из значений сводится к этому единственному значению»

Вывод карты-редукции может иметь различные формы (обычно плоские файлы).В MongoDB выходные данные на самом деле представляют собой новую коллекцию.

Особенности C #

В MongoDB все сокращения карт выполняются внутри движка javascript.Таким образом, обе функции map & Reduce написаны на JavaScript.Различные драйверы позволят вам собрать javascript и выполнить команду, однако я обычно не делаю это так.

Предпочтительный метод запуска заданий Map Reduce - это скомпилировать JS в файл, а затемmongo map_reduce.js.Как правило, вы будете делать это на сервере где-нибудь как задание cron или запланированное задание.

Почему?

Ну, сокращение карты - это не "в режиме реального времени", особенно с большимнабор данных.Он действительно предназначен для использования в пакетном режиме.Не поймите меня неправильно, вы можете вызвать его из своего кода, но, как правило, вы не хотите, чтобы пользователи инициировали работу по сокращению карты.Вместо этого вы хотите, чтобы эти задания были запланированы, и вы хотите, чтобы пользователи запрашивали результаты:)

2 голосов
/ 20 января 2011

Map Reduce - это способ обработки данных, когда у вас есть этап / функция карты, который идентифицирует все данные, подлежащие обработке, и построчная обработка.

Затем у вас есть шаг / функция сокращения, которые могутзапускаться несколько раз, например один раз на сервере в кластере, а затем один раз на клиенте, чтобы получить окончательный результат.

Вот статья в вики, описывающая его более подробно:

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

А вот документация для MongoDB для Mapreduce

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

Простой пример, найдите самую длинную строку в списке.

Картаstep будет зацикливаться по списку, вычисляя длину каждой строки, step down будет зацикливаться на результате с карты и для каждой строки сохранять самый длинный.

Это может быть гораздо более сложным, но это сутьоб этом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...