Мне нужна помощь с заданиями Mapreduce в Hadoop. У меня следующая проблема. У меня есть большой набор данных, содержащий несколько документов + категорию документа. Мне нужно рассчитать значение хи-квадрат для каждого термина в документах по категориям. Это означает, что мне нужно количество вхождений на термин в каждой категории + количество документов в каждой категории.
Мой подход состоит в том, чтобы иметь задание Mapreduce, которое подсчитывает количество вхождений каждого слова для каждой категории:
Ввод Mapper: (docId, TextOfDocument) -> ({термин, категория}, docID) Редуктор: (term, {category,NumberOfOccurences})
Проблема в том, что я теряю информацию о количестве документов в каждой категории, которая мне понадобится в моем следующем задании для расчета значения хи-квадрат.
Я думал о следующих решениях:
1) Используйте счетчики по категориям для хранения количества документов по категориям при чтении документов. Я думаю, что это будет самым лучшим и простым решением. Проблема в том, что я не знаю количество категорий, поэтому мне нужно будет динамически увеличивать количество счетчиков. Я не нашел способа сделать это в Hadoop (создать динамически увеличивающиеся счетчики)? Есть ли способ и как мне это сделать?
2) Сначала запустите задание и подсчитайте количество документов в каждой категории и как-нибудь сохраните его. Я не знаю, как получить данные или сохранить их как-то удобно, чтобы я мог читать, читая все документы.
3) Разделите его как-нибудь с дополнительными значениями для типов данных и как-нибудь посчитайте.
Может ли кто-нибудь помочь мне с этой порблемой? Какой подход будет лучшим? Или есть другие подходы? Спасибо за вашу помощь!




Я думаю, наконец, я мог бы найти решение для расчета количества сроков по категориям и количества документов по категориям за один проход.
На этапе карты вы должны извлечь все, что вам нужно, тогда ваши входные и выходные данные должны быть примерно такими:
<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 могут помочь каждой выходной записи каждого типа располагаться рядом друг с другом.
Большое спасибо! Это сработало, но теперь у меня проблема, как получить количество документов в каждой категории для следующей работы.
«1. <C_AFFIX+category+C_AFFIX, 1>» точно для получения количества документов в категории. На самом деле, он подсчитывает количество категорий, которые он видит в каждом документе.
дайте мне знать, если вы полностью разберетесь, как вышеуказанное решение может работать на вас. А результат многообещающий?
Сорри за поздний ответ! Но это сработало! Большое спасибо!
Если бы я был на вашем месте, я бы использовал Spark вместо Hadoop для этой работы. Это потому, что вы можете загрузить свои данные один раз в RDD, а затем запустить несколько карт и / или последовательных карт и уменьшить их. Я думаю найти решение для вашей проблемы, связанной с работой на велосипеде. надеюсь найти ;)