2010-12-08 4 views
3

Comment définir un ArrayWritable pour un type Hadoop personnalisé? Je suis en train de mettre en œuvre un index inversé dans Hadoop, avec mesure types Hadoop pour stocker les donnéesImplémentation d'un ArrayWritable pour un type Hadoop personnalisé

J'ai un individuel d'affichage classe qui stocke la fréquence du terme, identifiant du document et la liste des décalages d'octets pour le terme dans le document .

J'ai un affichage classe qui a une fréquence de document (nombre de documents, le terme apparaît dans) et la liste des Annonces individuels

J'ai défini une LongArrayWritable extension de la classe ArrayWritable pour la liste des décalages d'octets dans IndividualPostings

Quand je défini un ArrayWritable personnalisé pour IndividualPosting j'ai rencontré quelques problèmes après le déploiement local (en utilisant Karmasphere, Eclipse).

Tous les IndividualPosting instances dans la liste en classe d'affichage seraient les mêmes, même si je reçois des valeurs différentes dans la Réduire méthode

+0

Pouvez-vous expliquer exactement quel était le problème? Peut-être poster du code pour votre ArrayWritable personnalisé? – bajafresh4life

Répondre

8

De la documentation ArrayWritable:

A inscriptibles pour des tableaux contenant des instances d'une classe. Les éléments de cet écrit doivent tous être des instances de la même classe. Si cette écriture est l'entrée d'un réducteur, vous devez créer une sous-classe qui définit la valeur du type approprié. Par exemple: public class IntArrayWritable extends ArrayWritable { public IntArrayWritable() { super(IntWritable.class); } }

Vous ai déjà cité le faire avec un type défini par WritableComparable Hadoop. Voici ce que je suppose que votre implémentation ressemble à LongWritable:

public static class LongArrayWritable extends ArrayWritable 
{ 
    public LongArrayWritable() { 
     super(LongWritable.class); 
    } 
    public LongArrayWritable(LongWritable[] values) { 
     super(LongWritable.class, values); 
    } 
} 

Vous devriez être en mesure de le faire avec tout type qui implémente WritableComparable, comme indiqué par the documentation. En utilisant leur exemple:

public class MyWritableComparable implements 
     WritableComparable<MyWritableComparable> { 

    // Some data 
    private int counter; 
    private long timestamp; 

    public void write(DataOutput out) throws IOException { 
     out.writeInt(counter); 
     out.writeLong(timestamp); 
    } 

    public void readFields(DataInput in) throws IOException { 
     counter = in.readInt(); 
     timestamp = in.readLong(); 
    } 

    public int compareTo(MyWritableComparable other) { 
     int thisValue = this.counter; 
     int thatValue = other.counter; 
     return (thisValue < thatValue ? -1 : (thisValue == thatValue ? 0 : 1)); 
    } 
} 

Et cela devrait être cela. Cela suppose que vous utilisez la révision 0.20.2 ou 0.21.0 de l'API Hadoop.

Questions connexes