เมื่อเขียนโปรแกรม MapReduce ข้อมูลที่ส่งระหว่าง Map และ ลด ต้องเป็นประเภท ArrayList เมื่อทำการดีบักและรัน ฉันพบข้อผิดพลาดดังกล่าว:
java.lang.RuntimeException: java.lang.NoSuchMethodException: org.apache.hadoop.io.ArrayWritable.<init>()
หลังจากตรวจสอบเอกสาร API ของเว็บไซต์อย่างเป็นทางการแล้ว ฉันพบย่อหน้านี้:
เขียนได้สำหรับอาร์เรย์ที่มีอินสแตนซ์ของคลาส องค์ประกอบของการเขียนนี้ทั้งหมดจะต้องเป็นอินสแตนซ์ของคลาสเดียวกัน หากการเขียนนี้จะเป็นอินพุตสำหรับตัวลด คุณจะต้องสร้างคลาสย่อยที่ตั้งค่าให้เป็นของ ประเภทที่เหมาะสม ตัวอย่างเช่น: คลาสสาธารณะ IntArrayWritable ขยาย ArrayWritable { public IntArrayWritable() { super(IntWritable.class);
ปรากฎว่าคุณจำเป็นต้องใช้คลาสที่ได้รับของคลาส ArrayWritable ด้วยตัวเอง เมื่อใช้มัน คุณจะต้องใช้คอนสตรัคเตอร์สองตัวเท่านั้น
TextArrayWritable คลาสคงที่สาธารณะ { สาธารณะ TextArrayWritable () { ซุปเปอร์ (Text.class); } สาธารณะ TextArrayWritable (สตริง [] สตริง) { ซุปเปอร์ (Text.class); ข้อความ [] = ข้อความใหม่ [strings.length]; (int i = 0; i < strings.length; i++) { texts[i] = new Text(strings[i]); -