2012-09-14 17 views
10

Supponiamo che io ho una scheda file delimitato contenente i dati di attività utente formattato nel seguente modo:Hadoop - composito chiave

timestamp user_id page_id action_id 

Voglio scrivere un lavoro Hadoop per contare le azioni degli utenti in ogni pagina, in modo che il file di output dovrebbe essere in questo modo:

user_id page_id number_of_actions 

ho bisogno di qualcosa come chiave composta qui - conterrebbe id_utente e page_id. C'è un modo generico per farlo con hadoop? Non ho trovato nulla di utile. Finora sto chiave che emettono come questo nel mapper:

context.write(new Text(user_id + "\t" + page_id), one); 

Funziona, ma sento che non è la soluzione migliore.

risposta

13

Basta comporre il proprio Writable. Nel tuo esempio una soluzione potrebbe essere la seguente:

public class UserPageWritable implements WritableComparable<UserPageWritable> { 

    private String userId; 
    private String pageId; 

    @Override 
    public void readFields(DataInput in) throws IOException { 
    userId = in.readUTF(); 
    pageId = in.readUTF(); 
    } 

    @Override 
    public void write(DataOutput out) throws IOException { 
    out.writeUTF(userId); 
    out.writeUTF(pageId); 
    } 

    @Override 
    public int compareTo(UserPageWritable o) { 
    return ComparisonChain.start().compare(userId, o.userId) 
     .compare(pageId, o.pageId).result(); 
    } 

} 

Anche se credo che gli ID potrebbe essere un long, qui si ha la versione String. Fondamentalmente solo la normale serializzazione sull'interfaccia Writable, si noti che ha bisogno del costruttore predefinito quindi è sempre necessario fornirne uno.

La logica compareTo indica ovviamente come ordinare il set di dati e indica al riduttore quali elementi sono uguali in modo che possano essere raggruppati.

ComparisionChain è un utile programma di Guava.

Non dimenticare di sovrascrivere equals e hashcode! Il partizionatore determinerà il riduttore mediante l'hashcode della chiave.

+0

ComparisionChain rende davvero facile per questo caso d'uso. Grazie –

1

È possibile scrivere la propria classe che implementa Writable e WritableComparable che confronta i due campi.

Pierre-Luc Bertrand

Problemi correlati