Расчет рейтинга в Map / Reduce - PullRequest
3 голосов
/ 27 августа 2011

У меня есть простая проблема, которую трудно решить в SQL, и мне интересно, можно ли это сделать в системе сокращения карт.

Я хочу составить рейтинг. Представьте себе базу данных покупки Amazon (значительно упрощенная)

ORDERS
ISBN  copies_purchased
AAAA   5
AAAA   1
BBBBB  3
BBBBB  4
CCCC   3

Я хочу создать таблицу рейтинга

rank ISBN     copies_purchased
1    BBBB     7
2    AAAA     6
3    CCCC     3

Снижение карты до расчетных копий_куплено очевидно; расчет рейтинга меньше, по крайней мере для меня.

(Это не проблема домашнего задания. Мне это нужно для моей настоящей работы. Это лучше?)

EDIT Я думал, что это было бы очевидно из заголовка, тегов и текста вопроса, но это , а не вопрос SQL. Я хочу знать, как сделать это в карте / уменьшить. И да, у меня миллионы строк. Ну, наверное, миллиарды.

Ответы [ 4 ]

1 голос
/ 28 августа 2011

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

Во-первых, карта / уменьшение создает представление copies_purchased довольно легко, как вы сказали.Но ключевым пространством является ISBN ID, вам важны значения , но они не в определенном порядке.

Для небольших приложений люди просто выбирают весь набор данных и сортируютв памяти.Это отличный способ, если вы знаете свои требования;но он не масштабируется.

Масштабируемое решение заключается в размещении этих строк в их собственной базе данных. секунда сопоставление / уменьшение может испускать ключи от copies_purchased и значения обратно в ISBN.(Нет необходимости в шаге уменьшения.)

Key                 Value
copies_purchased    ISBN

7                   BBBB
6                   AAAA
3                   CCCC

Вы можете выбрать N верхних строк или найти, например, книгу седьмого ранга, запросив ?skip=6&limit=1

0 голосов
/ 01 сентября 2011

Я не уверен, как бы вы сделали это, используя couchdb. Насколько я знаю, нет возможности напрямую читать данные couchdb в hadoop. Самая близкая вещь, о которой я знаю, это Brisk , который сочетает в себе хадуп и кассандру. Это также бесплатно.

В качестве альтернативы, если это не должно занимать до минуты, вы можете вывести соответствующие данные в текстовые или последовательные файлы и использовать их в качестве входных данных.

Я думаю, вы должны сделать это в 2 этапа. Во-первых, сгенерируйте приобретенные копии, что в основном является примером подсчета слов, который так часто встречается в hadoop.

Так как вы можете относительно легко определить максимальное количество приобретенных копий, посмотрев на выходную информацию о приобретенной копии копий (это может быть работа сама по себе), вы можете затем создать собственный разделитель, который будет делить продукты в соответствии с копии куплены. Таким образом, если у вас есть 3 редуктора, а максимальная сумма, которую вы продаете, составляет 600 копий, то редуктор 1 берет продукты, продающие 0–200 копий, редуктор 2 - продукты, продающие 201–400, а редуктор 3 - продукты, продающие 401–600 копий. Затем вы можете объединить отсортированные выходные файлы редуктора, и вам будет продан ваш отсортированный список копий.

Или для исходного кода, посмотрите код теста производительности terasort здесь . Больше информации о занятиях Terasort здесь .

Таким образом, вы получите рабочий процесс, подобный:

  1. Задание для расчета количества проданных копий для продукта
  2. Задание, которое находит наибольшее количество проданных копий, основываясь на результатах предыдущего задания (хотя вы можете пропустить этот шаг в зависимости от того, как вы выполняете сортировку.)
  3. Задание, которое сортирует данные и выдает отсортированный список проданных копий продукта. Может выводиться через несколько файлов, поэтому вам может понадобиться простой скрипт, который объединяет их вместе.

Для получения справки по управлению многоэтапным рабочим процессом, подобным этому, взгляните на Oozie или Cascading .

Подробнее о сортировке см. этот ответ .

0 голосов
/ 27 августа 2011

Его легко решить в SQL, если у вас нет миллионов строк.

ВЫБРАТЬ ISBN, количество (*) ОТ заказов ГРУППА ПО ISBN ЗАКАЗАТЬ НА 2 desc;

0 голосов
/ 27 августа 2011

Если ранг определяется количеством проданных копий, вы можете построить эту таблицу с помощью курсора выбора sql:

select * from ORDERS orderby copies_purchased desc

И затем назначить ранг на основе порядка, в котором вы получаете записи

while (nextRecord) currRecord.rank = i++;
...