Подтвердить что ты не робот

Может ли кто-нибудь объяснить сокращение карты в С#?

Может кто-нибудь объяснить концепцию уменьшения карты, особенно в Монго?

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

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

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

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

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

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

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

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

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

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

Почему?

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

Ответ 3

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

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

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

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

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

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

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

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

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