MapReduce プログラムを作成する場合、Map と Reduce の間で渡されるデータは ArrayList 型である必要があります。デバッグおよび実行中に、次のようなエラーが発生しました。
java.lang.RuntimeException: java.lang.NoSuchMethodException: org.apache.hadoop.io.ArrayWritable.<init>()
公式 Web サイトの API ドキュメントを確認したところ、次の段落を見つけました。
クラスのインスタンスを含む配列の Writable。この書き込み可能オブジェクトの要素はすべて同じクラスのインスタンスである必要があります。この書き込み可能オブジェクトが Reducer の入力となる場合は、その値を設定するサブクラスを作成する必要があります。例: public class IntArrayWritable extends ArrayWritable { public IntArrayWritable() { super(IntWritable.class) } }
ArrayWritable クラスの派生クラスを自分で実装する必要があることがわかりました。これを使用する場合、実装する必要があるのは 2 つのコンストラクターだけです。
public static class TextArrayWritable extends ArrayWritable { public TextArrayWritable() { super(Text.class); } public TextArrayWritable(String[] strings) { super(Text.class) = new Text[strings.length]; (int i = 0; i < strings.length; i++) { texts[i] = new Text(strings[i]) } set(texts); }}