Динамический счетчик Hadoop

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

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

Ввод Mapper: (docId, TextOfDocument) -> ({термин, категория}, docID) Редуктор: (term, {category,NumberOfOccurences})

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

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

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

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

3) Разделите его как-нибудь с дополнительными значениями для типов данных и как-нибудь посчитайте.

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

Если бы я был на вашем месте, я бы использовал Spark вместо Hadoop для этой работы. Это потому, что вы можете загрузить свои данные один раз в RDD, а затем запустить несколько карт и / или последовательных карт и уменьшить их. Я думаю найти решение для вашей проблемы, связанной с работой на велосипеде. надеюсь найти ;)

Amin Heydari Alashti 17.04.2019 22:39
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
1
384
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

На этапе карты вы должны извлечь все, что вам нужно, тогда ваши входные и выходные данные должны быть примерно такими:

<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 могут помочь каждой выходной записи каждого типа располагаться рядом друг с другом.

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

swageta 18.04.2019 09:10

«1. <C_AFFIX+category+C_AFFIX, 1>» точно для получения количества документов в категории. На самом деле, он подсчитывает количество категорий, которые он видит в каждом документе.

Amin Heydari Alashti 18.04.2019 09:13

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

Amin Heydari Alashti 18.04.2019 10:25

Сорри за поздний ответ! Но это сработало! Большое спасибо!

swageta 17.05.2019 15:40

Другие вопросы по теме