Beim Schreiben eines MapReduce-Programms müssen die zwischen Map und Reduce übertragenen Daten vom Typ ArrayList sein. Beim Debuggen und Ausführen ist ein solcher Fehler aufgetreten:
java.lang.RuntimeException: java.lang.NoSuchMethodException: org.apache.hadoop.io.ArrayWritable.<init>()
Nachdem ich die offizielle API-Dokumentation der Website überprüft hatte, fand ich diesen Absatz:
Ein beschreibbares Element für Arrays, die Instanzen einer Klasse enthalten. Die Elemente dieses beschreibbaren Elements müssen alle Instanzen derselben Klasse sein. Wenn dieses beschreibbare Element die Eingabe für einen Reduzierer sein soll, müssen Sie eine Unterklasse erstellen, die den Wert festlegt Richtiger Typ. Zum Beispiel: public class IntArrayWritable erweitert ArrayWritable { public IntArrayWritable() { super(IntWritable.class } }
Es stellt sich heraus, dass Sie eine abgeleitete Klasse der ArrayWritable-Klasse selbst implementieren müssen. Wenn Sie sie verwenden, müssen Sie nur zwei Konstruktoren implementieren.
öffentliche statische Klasse TextArrayWritable erweitert ArrayWritable { public TextArrayWritable() { super(Text.class); } public TextArrayWritable(String[] strings) { super(Text.class); Text[] texts = new Text[strings.length]; (int i = 0; i < strings.length; i++) { texts[i] = new Text(strings[i] } set(texts); }}