2013-08-09 13 views
5

Il mio problema è l'ordinamento dei valori in un file. Le chiavi e i valori sono numeri interi e devono mantenere le chiavi dei valori ordinati.Come implementare l'ordinamento in hadoop?

key value 
1  24 
3  4 
4  12 
5  23 

uscita:

1  24 
5  23 
4  12 
3  4 

sto lavorando con dati di massa e deve eseguire il codice in un cluster di macchine Hadoop. Come posso farlo con mapreduce?

+0

Allora, che cosa si desidera ordinare? chiave o valore? Puoi fornire un esempio che mostra il file e come dovrebbe essere ordinato? –

+0

@JtheRocker ho modificato. – user1878364

+0

Quindi, le tue chiavi sono uniche? –

risposta

12

Probabilmente si può fare questo (sto supponendo che si sta utilizzando Java qui)

Da mappe emettono come questo -

context.write(24,1); 
context.write(4,3); 
context.write(12,4) 
context.write(23,5) 

Quindi, tutti i valori che devono essere ordinati dovrebbe essere il inserisci il tuo lavoro mapreduce. Hadoop di default ordina in ordine crescente di chiave.

Quindi, o si fa questo per ordinare in ordine decrescente,

job.setSortComparatorClass(LongWritable.DecreasingComparator.class); 

Oppure, questo,

è necessario impostare una consuetudine Descending Ordina comparatore, che va qualcosa di simile nel tuo lavoro.

public static class DescendingKeyComparator extends WritableComparator { 
    protected DescendingKeyComparator() { 
     super(Text.class, true); 
    } 

    @SuppressWarnings("rawtypes") 
    @Override 
    public int compare(WritableComparable w1, WritableComparable w2) { 
     LongWritable key1 = (LongWritable) w1; 
     LongWritable key2 = (LongWritable) w2;   
     return -1 * key1.compareTo(key2); 
    } 
} 

Il suffle e una sorta di fase in Hadoop si prenderà cura di ordinare le chiavi in ​​ordine 24,4,12,23

decrescente Dopo commento:

Se è necessario un Discendente IntWritable paragonabile, è possibile crearne uno e utilizzarlo come questo -

job.setSortComparatorClass(DescendingIntComparable.class); 

Nel caso in cui se si utilizza JobConf, utilizzare questo per impostare

jobConfObject.setOutputKeyComparatorClass(DescendingIntComparable.class); 

inserire il seguente codice sotto la vostra funzione main() -

public static void main(String[] args) { 
    int exitCode = ToolRunner.run(new YourDriver(), args); 
    System.exit(exitCode); 
} 

//this class is defined outside of main not inside 
public static class DescendingIntWritableComparable extends IntWritable { 
    /** A decreasing Comparator optimized for IntWritable. */ 
    public static class DecreasingComparator extends Comparator { 
     public int compare(WritableComparable a, WritableComparable b) { 
      return -super.compare(a, b); 
     } 
     public int compare(byte[] b1, int s1, int l1, byte[] b2, int s2, int l2) { 
      return -super.compare(b1, s1, l1, b2, s2, l2); 
     } 
    } 
} 
+0

Se ho 5 computer eseguendo il codice, funziona questo codice e il risultato finale è assolutamente vero? di quanti riduttori ho bisogno? – user1878364

+0

Sì, è possibile avere un numero qualsiasi di riduttori. Suppongo anche che tu sappia come scrivere un lavoro MapReduce. Si prega di fare un tentativo e dimmi se risolve il problema. Penso che cambierà con il caso d'uso che hai menzionato. Grazie. –

+0

Lavoro con jobconf, non ha il metodo setSortComparatorClass. – user1878364