MapReduce 프로그램을 작성할 때 Map과 Reduce 사이에 전달되는 데이터는 ArrayList 유형이어야 합니다. 디버깅하고 실행할 때 다음과 같은 오류가 발생했습니다.
java.lang.RuntimeException: java.lang.NoSuchMethodException: org.apache.hadoop.io.ArrayWritable.<init>()
공식 웹사이트 API 문서를 확인한 후 다음 단락을 발견했습니다.
클래스의 인스턴스를 포함하는 배열에 대한 쓰기 가능 항목은 모두 동일한 클래스의 인스턴스여야 합니다. 이 쓰기 가능 항목이 감속기의 입력이 될 경우 해당 값을 설정하는 하위 클래스를 생성해야 합니다. 예를 들면 다음과 같습니다. public class IntArrayWritable extends ArrayWritable { public IntArrayWritable() { super(IntWritable.class) }
ArrayWritable 클래스의 파생 클래스를 직접 구현해야 한다는 사실이 밝혀졌습니다. 이를 사용할 때는 두 개의 생성자만 구현하면 됩니다.
공개 정적 클래스 TextArrayWritable 확장 ArrayWritable { 공개 TextArrayWritable() { super(Text.class); } 공개 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); }}