О, как я взволнован вашим вопросом!На самом деле это было частью моего последнего задания для моего класса распределенных систем, так что это довольно свежо в моем недавнем образовании.
Для деталей разбора я бы просто заглянул в учебник Apache по Hadoop, но я дамВы общий обзор.
В принципе, эта проблема требует двух этапов Map-Reduce.На первой карте ваш ввод должен представлять собой список <filename, {list of keywords}>
пар ключ-значение (может потребоваться предварительная обработка файлов, но не важная персона).Для каждой из этих пар вы выводите <keyword, 1>
в качестве пары, которая должна быть передана редуктору (по сути, вы говорите, что каждое слово должно учитываться один раз).
В первом проходе сокращения предыдущие пары ключ-значениебудет удобно сжато, так что у каждого ключевого слова будет своя собственная пара вида <keyword, {1,1,1,1,1,1}>
, где число 1 представляет число раз, когда слово встречается во всех документах.Таким образом, вы просто суммируете 1 с и выводите <keyword, sum>
.
Последняя фаза сопоставления / сокращения состоит в том, чтобы просто отсортировать ключевые слова по их значению.Карта: <keyword,sum> --> <sum,keyword> Reduce: <sum, {keywords}> --> <keyword,sum>
.Это использует тот факт, что map-Reduce сортирует по ключу при переходе к фазе Reduce.
Теперь все ключевые слова находятся рядом с их количеством слов в отсортированном порядке!