Динамический счетчик Hadoop - PullRequest
0 голосов
/ 17 апреля 2019

Мне нужна помощь с заданиями Mapreduce в Hadoop.У меня следующая проблема.У меня большой набор данных, содержащий несколько документов + категория документа.Мне нужно рассчитать значение хи-квадрат для каждого термина в документах по категории.Это означает, что мне нужно количество вхождений за семестр в каждой категории + количество документов в каждой категории.

Мой подход заключается в том, чтобы иметь задание Mapreduce, которое подсчитывает количество вхождений для каждого слова для каждой категории:

Input Mapper: (docId, TextOfDocument) -> ({term, category},docID) Редуктор: (term, {category, NumberOfOccurences})

Проблема с этим заключается в том, что я теряю информацию о количестве документов в каждой категории, которая мне понадобится в моей следующей работе для расчета чи-square value.

Я думал о следующих решениях:

1) Используйте счетчики на категорию для хранения количества документов на категорию при чтении в документах.Я думаю, что это будет лучшим и самым простым решением.Проблема в том, что я не знаю количество категорий, поэтому мне нужно было бы динамически увеличивать количество счетчиков.Я не нашел способ сделать это в Hadoop (создать динамически увеличивающиеся счетчики)?Есть ли способ и как бы я это сделал?

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

3) Как-то разделить его на дополнительные значения для типов данных и как-то подсчитать.

Может ли кто-нибудь помочь мне с этой проблемой?Какой подход будет лучшим?Или есть другие подходы?Спасибо за вашу помощь!

1 Ответ

0 голосов
/ 18 апреля 2019

Думаю, наконец-то я смог найти решение для подсчета вашего термина по категориям и количеству документов по категориям за один проход.

В фазе карты вы должны извлечь то, что вам нужно, тогда ваши входные и выходные данные должны выглядеть примерно так:

<docId, TextOfDocument> --> 
1. "<C_AFFIX+category+C_AFFIX, 1>" 
2. "<CT_AFFIX+category+term+CT_AFFIX, 1>"

C_AFFIX и CT_AFFIX: просто идентификаторы, помогающие не смешивать ключи этих двух разных типов друг с другом.

и в фазе сокращения вы должны действовать как классическая задача подсчета слов и просто считать и сортировать в вывод:

int sum = 0;
for (IntWritable val : values) {
  sum += val.get();
}
result.set(sum);
context.write(key, result);

C_AFFIX и CT_AFFIX могут помочь каждой выходной записи мест каждого типа рядом друг с другом.

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