2015-12-29 3 views
0

En Hadoop tri secondaire le code composite a la méthode suivante pour comparer les valeurs, la classe clé Composite implémente WritableComparable: -Hadoop secondaire Trier compareTo clé composite vs personnalisée Sorter comparer les implémentations

@Override 
public int compareTo(CustomKey o) { 

    int result = firstName.compareTo(o.getFirstName());  
    log.debug("value is " + result);     
    if (result == 0) { 
     return lastName.compareTo(o.getLastName()); 
    } 
    return result; 
} 

Dans le trieur personnalisé nous créons pour effectuer des tri secondaire qui s'étend WritableComparator et le code va comme ceci: -

@Override 
public int compare(WritableComparable w1, WritableComparable w2) { 
    CustomKey key1 = (CustomKey) w1; 
    CustomKey key2 = (CustomKey) w2; 
    int value = key1.getFirstName().compareTo(key2.getFirstName()); 
    if (value == 0) {   
     return -key1.getLastName().compareTo(key2.getLastName());  
    } 
    return value; 
} 

Je veux savoir pourquoi nous comparons les valeurs deux fois pour le tri une fois dans CustomKey classe par œuvre mentant WritableComparable puis nous créons à nouveau une classe CustomSorter pour trier la valeur en étendant WritableComparator.

+0

Pouvez-vous fournir la référence d'où vous avez pris ce code? – YoungHobbit

Répondre

0

Je ne sais pas exactement d'où provient le code dont vous avez parlé.

Je vais essayer d'y répondre de manière générique.

Voici l'extrait du Guide définitif Hadoop pour le tri secondaire,

  1. Faire la clé un composite de la clé naturelle et la valeur naturelle.
  2. Le comparateur de tri doit être trié par la clé composite, c'est-à-dire la clé naturelle et la valeur naturelle.
  3. Le comparateur de partitionnement et de regroupement pour la clé composite doit prendre en compte uniquement la clé naturelle pour le partitionnement et le regroupement.

Le regroupement de clés similaires sera très efficace lors du tri. Le comparateur de regroupement est destiné à cela, il aide à identifier efficacement les morceaux de clés qui sont similaires. Ex: Supposons que vous obteniez les clés suivantes (composite) de votre mappeur.

A, 1

B, 2

A, 2

B, 3

comparateur regroupement travaillera sur ces questions et de les trier comme ci-dessous,

A, 1

A, 2

B, 2

B, 3

Pour vous d'obtenir le tri secondaire au travail, vous devez alors effectuer un tri sur la partie de la valeur. C'est ce qui est réalisé par le SortingComparator.

sortie final serait, (condition d'avoir un partitionneur, que les partitions du rôle clé dans la clé composite)

A, 2

A, 1

B, 3

B, 2

+0

Salut, le code complet est ici: - http://stackoverflow.com/questions/34505078/hadoop-m-r-secondary-sort-not-working-bases-on-last-name-of-the-user – user3837453

0

ur méthode de tri personnalisé ne sera nécessaire que dans 2 conditions: 1) le processus de tri dans la classe CustomSorter est différent de celui de comparer Pour la méthode de votre classe CompositeKey 2), vous voulez donner la préférence à la logique de tri de la classe CustomSorter. Si les conditions ci-dessus ne sont pas remplies, votre classe CompositeKey suffira pour le tri.