При написании программы MapReduce данные, передаваемые между Map и Reduce, должны иметь тип ArrayList. При отладке и запуске я столкнулся с такой ошибкой:
java.lang.RuntimeException: java.lang.NoSuchMethodException: org.apache.hadoop.io.ArrayWritable.<init>()
Проверив официальную документацию по API веб-сайта, я нашел этот абзац:
Объект для записи для массивов, содержащих экземпляры класса. Все элементы этого объекта для записи должны быть экземплярами одного и того же класса. Если этот объект для записи будет входными данными для Редюсера, вам потребуется создать подкласс, который установит значение, равное значению класса. правильный тип. Например: общественный класс IntArrayWritable расширяет ArrayWritable { public IntArrayWritable() { super(IntWritable.class } );
Получается, что вам нужно самостоятельно реализовать производный класс класса ArrayWritable. При его использовании вам нужно реализовать всего два конструктора.
общественный статический класс TextArrayWritable расширяет ArrayWritable {public TextArrayWritable () { super (Text.class); } public TextArrayWritable (String [] strings) { super (Text.class); Text [] texts = new Text [strings.length]; (int i = 0; я <strings.length; я++) {texts[i] = new Text(strings[i]) set(texts); }}