Die Eingabe für den Mapper hängt davon ab, welches InputFormat verwendet wird. Das InputFormat ist dafür verantwortlich, die eingehenden Daten zu lesen und in ein beliebiges Format zu bringen, das der Mapper erwartet. Das Standard-InputFormat ist TextInputFormat, das sich um FileInputFormat<LongWritable, Text>
erweitert.
Wenn Sie das InputFormat nicht ändern, verursacht die Verwendung eines Mappers mit einer anderen Signatur vom Typ "Schlüsselwert" als diesen Fehler. Wenn Sie die Eingabe <Text, Text>
erwarten, müssen Sie ein geeignetes InputFormat auswählen. Sie können das Inputformat in Job-Setup einstellen:
job.setInputFormatClass(MyInputFormat.class);
Und wie gesagt, immer standardmäßig auf TextInputFormat gesetzt.
Nun lassen Sie uns sagen, dass Ihre Eingabedaten ein Bündel von Newline getrennte Datensätze durch Komma begrenzt ist:
Wenn Wenn der Eingabeschlüssel für den Mapper sein soll ("A", "Wert1"), ("B", "Wert2"), müssen Sie ein benutzerdefiniertes InputFormat und RecordReader mit der Signatur <Text, Text>
implementieren. Zum Glück, das ist ziemlich einfach. Es gibt an example here und wahrscheinlich auch ein paar Beispiele, die sich um StackOverflow herum bewegen.
Kurz gesagt, fügen Sie eine Klasse, die FileInputFormat<Text, Text>
erweitert und eine Klasse, die RecordReader<Text, Text>
erweitert. Überschreiben Sie die FileInputFormat#getRecordReader
-Methode und lassen Sie eine Instanz Ihres benutzerdefinierten RecordReaders zurückgeben.
Dann müssen Sie die erforderliche RecordReader-Logik implementieren. Der einfachste Weg dazu besteht darin, in Ihrem benutzerdefinierten RecordReader eine Instanz von LineRecordReader zu erstellen und alle grundlegenden Verantwortlichkeiten an diese Instanz zu delegieren. In den Methoden getCurrentKey und getCurrentValue implementieren Sie die Logik zum Extrahieren der durch Komma getrennten Textinhalte, indem Sie LineRecordReader#getCurrentValue
aufrufen und auf Komma trennen.
Schließlich legen Sie Ihr neues InputFormat als Job InputFormat wie nach dem zweiten Absatz oben gezeigt.
Es ist nicht obligatorisch, 'LongWritable' als Schlüssel zu verwenden . Was machst du, um diese Ausnahme zu generieren? Wo kommt es in Ihrem Code vor? – Vidya
Ich mache nichts explizit, um diese Ausnahme zu generieren - IT zeigt :: java.lang.ClassCastException: org.apache.hadoop.io.LongWritable kann nicht in org.apache.hadoop.io.Text bei ExamTest $ umgewandelt werden Map.map (ExamTest.java:1) bei org.apache.hadoop.mapreduce.Mapper.run (Mapper.java:144) bei org.apache.hadoop.mapred.MapTask.runNewMapper (MapTask.java:764) bei org.apache.hadoop.mapred.MapTask.run (MapTask.java:370) bei org.apache.hadoop.mapred.Child $ 4.run (Child.java:255) – Ronin
Können Sie bitte die Situation erklären? Vielen Dank. – Ronin