Ответ 1
Вход в устройство отображения зависит от того, что используется InputFormat. InputFormat отвечает за чтение входящих данных и формирование их в любом формате, который ожидает Mapper. По умолчанию InputFormat TextInputFormat, который расширяет FileInputFormat<LongWritable, Text>
.
Если вы не меняете InputFormat, используйте Mapper с различной сигнатурой типа Key-Value, чем <LongWritable, Text>
приведет к этой ошибке. Если вы ожидаете ввода <Text, Text>
, вам нужно будет выбрать подходящий InputFormat. Вы можете установить InputFormat в настройке Job:
job.setInputFormatClass(MyInputFormat.class);
И, как я уже сказал, по умолчанию этот параметр установлен в TextInputFormat.
Теперь скажем, что ваши входные данные представляют собой группу разделенных новой строкой записей, разделенных запятой:
- "A, value1"
- "В, значение2"
Если вы хотите, чтобы клавиша ввода отображалась на карте ( "A", "value1" ), ( "B", "value2" ), вам придется реализовать пользовательский InputFormat и RecordReader с подписью <Text, Text>
. К счастью, это довольно просто. Существует пример здесь и, возможно, несколько примеров, плавающих вокруг StackOverflow.
Короче говоря, добавьте класс, который расширяет FileInputFormat<Text, Text>
и класс, который расширяет RecordReader<Text, Text>
. Переопределите метод FileInputFormat#getRecordReader
и верните экземпляр своего пользовательского RecordReader.
Затем вам придется реализовать требуемую логику RecordReader. Самый простой способ сделать это - создать экземпляр LineRecordReader в вашем пользовательском RecordReader и делегировать все основные обязанности этому экземпляру. В методах getCurrentKey и getCurrentValue вы реализуете логику для извлечения текстового содержимого с разделителями-запятыми, вызывая LineRecordReader#getCurrentValue
и разбивая его на запятую.
Наконец, установите новый InputFormat как Job InputFormat, как показано после второго абзаца выше.