Вход в устройство отображения зависит от того, что используется InputFormat. InputFormat отвечает за чтение входящих данных и формирование их в любом формате, который ожидает Mapper. По умолчанию InputFormat равен TextInputFormat, который расширяет FileInputFormat<LongWritable, Text>
.
Если вы не меняете InputFormat, используйте Mapper с различной сигнатурой типа Key-Value, чем <LongWritable, Text>
, что приведет к этой ошибке. Если вы ожидаете ввода <Text, Text>
, вам нужно будет выбрать подходящий InputFormat. Вы можете установить InputFormat в настройке работы:
job.setInputFormatClass(MyInputFormat.class);
И как я уже сказал, по умолчанию установлено в TextInputFormat.
Теперь предположим, что ваш входные данные кучу новой строки разделенных записей, разделенных запятой:
- "А, value1"
- "B, значение2"
Если вы хотите, чтобы ключ ввода к отображаемому устройству был («A», «value1»), («B», «value2»), вам придется реализовать пользовательский InputFormat и RecordReader с подписью <Text, Text>
. К счастью, это довольно легко. Существует an example here и, вероятно, несколько примеров, плавающих вокруг StackOverflow.
Короче говоря, добавьте класс, который расширяет FileInputFormat<Text, Text>
и класс, который распространяется на RecordReader<Text, Text>
. Переопределите метод FileInputFormat#getRecordReader
и верните экземпляр своего пользовательского RecordReader.
Затем вам нужно будет реализовать требуемую логику RecordReader. Самый простой способ сделать это - создать экземпляр LineRecordReader в своем пользовательском RecordReader и делегировать все основные обязанности этому экземпляру. В методах getCurrentKey и getCurrentValue вы реализуете логику для извлечения содержимого текста с разделителями-запятыми, вызывая LineRecordReader#getCurrentValue
и разбивая его на запятую.
Наконец, установите новый InputFormat как Input InputFormat, как показано после второго абзаца выше.
Не обязательно использовать 'LongWritable' в качестве ключа , Что вы делаете для создания этого исключения? Где это происходит в вашем коде? – Vidya
Я не делаю ничего явно, чтобы сгенерировать это исключение - IT показывает :: java.lang.ClassCastException: org.apache.hadoop.io.LongWritable нельзя отнести к org.apache.hadoop.io.Text в ExamTest $ Map.map (ExamTest.java:1) на org.apache.hadoop.mapreduce.Mapper.run (Mapper.java:144) на org.apache.hadoop.mapred.MapTask.runNewMapper (MapTask.java:764) at org.apache.hadoop.mapred.MapTask.run (MapTask.java:370) at org.apache.hadoop.mapred.Child $ 4.run (Child.java:255) – Ronin
Не могли бы вы объяснить ситуацию? Спасибо. – Ronin