Saat menulis program MapReduce, data yang dikirimkan antara Map dan Reduce harus bertipe ArrayList. Saat melakukan debug dan menjalankan, saya mengalami kesalahan seperti ini:
java.lang.RuntimeException: java.lang.NoSuchMethodException: org.apache.hadoop.io.ArrayWritable.<init>()
Setelah memeriksa dokumentasi API situs web resmi, saya menemukan paragraf ini:
Sebuah Writable untuk array yang berisi instance dari suatu kelas. Semua elemen dari writable ini harus merupakan instance dari kelas yang sama. Jika writable ini akan menjadi masukan untuk Reducer, Anda perlu membuat subkelas yang menetapkan nilai menjadi dari kelas tersebut. tipe yang tepat. Misalnya: public class IntArrayWritable extends ArrayWritable { public IntArrayWritable() { super(IntWritable.class);
Ternyata Anda perlu mengimplementasikan sendiri kelas turunan dari kelas ArrayWritable. Saat menggunakannya, Anda hanya perlu mengimplementasikan dua konstruktor.
kelas statis publik TextArrayWritable extends 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++) { teks[i] = Teks baru(string[i] } set(teks); }}