Вы можете создать свой собственный класс MultipleOutputFormat
, MyMultipleOutputFormat
(что-то вроде того, что вы делаете) и создать функцию, которая принимает Reporter
(а также другие параметры), которая затем вызывает базуgenerateFileNameForKeyValue
.
Если есть способ получить доступ к Job
, откуда вам нужно его записать.Вы можете получить context
из job
(context.getConfiguration()
) и затем увеличить счетчик (context.getCounter(YOUR_COUNTER.HERE).increment(1);
)
Я не знаю вашей точной ситуации, но пытаюсь использовать счетчик внутри функцииэто должно действовать на / для одной записи, кажется ненужным и, вероятно, может быть сделано «снаружи», где доступ к Reporter
/ * 1015. * легок. Я могу ошибаться, и ваша ситуация / использование счетчика там необходимы,но я бы посоветовал проверить, действительно ли вам это нужно внутри этой функции, или это можно сделать и снаружи.
Редактировать: ответить на пару неясных моментов; Создание функции, которая принимаетa Reporter
: так как вы расширяете MultipleOutputFormat
, вы можете добавлять дополнительные функции. Если вы добавите определение функции generateFileNameForKeyValueAndTrack(K key, V value, String name, Reporter reporter)
, вы можете затем увеличить счетчик в этой функции и заставить ее вызывать generateFileNameForKeyValue
, передавая key
, value
и name
.
Использование счетчика внутри кажется ненужным: я предполагаю, что вы вызываете generateFileNameForKeyValue
внутри функции map
. Замените map
на whatevЕсли это предположение неверно.Создайте коллекцию (не важно, какой тип, если она может выполнять то, что я описываю), в которой вы сохраняете сгенерированное имя файла.Каждый раз, когда генерируется имя файла, вы можете проверить, существует ли оно в коллекции, и увеличить соответствующий счетчик.Я вижу привлекательность делать это внутри функции generate...
, чтобы избежать дублирования данных, так что я бы (вне головы), вероятно, занялся созданием дополнительной функции (указанной выше).
Iнадеюсь, это поможет прояснить то, что я предлагал.
Чтобы поддерживать нормальное общение (и меня уведомляли), если у вас есть комментарии / вопросы, касающиеся этого поста, используйте добавление комментария к этому посту вместо добавления ответа..