У меня есть аналогичная проблема с Wordcount. В моем случае мне нужно написать слова начинается с каждой буквы в отдельные файлы. Вот я использовал MultipleOutputs
.
public class NameCountReducer extends Reducer<Text, NameCountTuple, Text, NameCountTuple> {
private NameCountTuple result = null;
private MultipleOutputs<Text,NameCountTuple> out;
public void setup(Context context) {
out = new MultipleOutputs<Text,NameCountTuple>(context);
}
public void reduce(Text key, Iterable<NameCountTuple> values, Context context)
throws IOException, InterruptedException {
int count = 0;
for (HITuple val : values) {
count += val.getCount();
}
result.setCount(count);
out.write(key, result,"outputpath/"+key.getText().charAt(0));
}
public void cleanup(Context context) throws IOException,InterruptedException {
out.close();
}
}
Здесь он дает выход в следующих путей как
outputpath/a
/b
/c
.......
Для этого вы должны использовать LazyOutputFormat.setOutputFormatClass()
вместо FileOutputFormat
. Также необходимо добавить конфигурацию задания как job.setOutputFormatClass(NullOutputFormat.class)
Спасибо. Я понимаю, что всегда оставил задачи редуктора по умолчанию без установки значения, поэтому он всегда был 1. – Koh