Lors de l'écriture d'un programme MapReduce, les données transmises entre Map et Reduction doivent être de type ArrayList. Lors du débogage et de l'exécution, j'ai rencontré une telle erreur :
java.lang.RuntimeException : java.lang.NoSuchMethodException : org.apache.hadoop.io.ArrayWritable.<init>()
Après avoir consulté la documentation officielle de l'API du site Web, j'ai trouvé ce paragraphe :
Un Writable pour les tableaux contenant des instances d'une classe. Les éléments de ce Writable doivent tous être des instances de la même classe. Si cet Writable sera l'entrée d'un Réducteur, vous devrez créer une sous-classe qui définit la valeur comme étant celle du Réducteur. type approprié. Par exemple : public class IntArrayWritable extends ArrayWritable { public IntArrayWritable() { super(IntWritable.class } });
Il s'avère que vous devez implémenter vous-même une classe dérivée de la classe ArrayWritable. Lorsque vous l'utilisez, vous n'avez besoin que d'implémenter deux constructeurs.
public static class TextArrayWritable extends ArrayWritable { public TextArrayWritable() { super(Text.class); } public TextArrayWritable(String[] strings) { super(Text.class Text[] texts = new Text[strings.length] pour (int i = 0; i < strings.length; i++) { textes[i] = new Text(strings[i] } set(textes); }}