2011-06-28 5 views
2

Je travaille sur un travail de réduction de mappe HBase et j'ai besoin de comprendre si les colonnes d'une famille de colonnes uniques sont retournées triées par leur nom (clé). Si oui, je n'aurais pas besoin de le faire à l'étape du tri aléatoire.Est-ce que HBase scan renvoie des colonnes triées?

Merci

Répondre

-1

pas, les colonnes ne sont pas triés Ils sont stockés en interne sous forme de paires clé-valeur dans un tableau long octet. Mais, vous devriez clarifier votre question sur ce dont vous avez réellement besoin pour cela.

+0

Mon système suit certains types d'événements. Chaque clé de ligne est l'identifiant et le jour de la source, et chaque colonne est l'identifiant et les données de l'événement. Cette structure semble juste puisque j'ai toujours besoin des événements d'une journée entière plutôt que d'un seul. Quand j'analyse les événements, j'ai besoin qu'ils soient triés par identifiant. Je vais généralement faire cela sur la carte et trier/mélanger l'étape et laisser le calcul pour la réduction, mais si elles sont déjà triées je peux l'ignorer et faire le calcul entier sur l'étape de la carte. – Huser

+0

Si toutes les données dont vous avez besoin se trouvent sur une ligne, pourquoi ne pas les trier en mémoire en utilisant des structures/opérations de données conventionnelles? La phase de mélange/tri/réduction est très coûteuse. – David

+1

Les colonnes sont en effet triées. Voir: http://comments.gmane.org/gmane.comp.java.hadoop.hbase.user/24414 – jeffreyveon

1

J'ai un modèle de données très similaire à vous. Lors de l'insertion, cependant, je définis mes propres valeurs pour les horodateurs sur l'objet Put. Cependant, je l'ai fait d'une manière qui a pris une «graine» de l'heure actuelle et a ajouté un compteur incrémentant pour chaque événement que j'ai persisté dans le lot.

Quand j'ai tiré les résultats à partir de l'analyse, j'ai écrit un comparateur:

public class KVTimestampComparator implements Comparator<KeyValue> { 

    @Override 
    public int compare(KeyValue kv1, KeyValue kv2) { 
     Long kv1Timestamp = kv1.getTimestamp(); 
     Long kv2Timestamp = kv2.getTimestamp(); 

     return kv1Timestamp.compareTo(kv2Timestamp); 
    } 
} 

ensuite trié la ligne brute:

List<KeyValue> row = Arrays.asList(result.raw()); 
Collections.sort(row, new KVTimestampComparator()); 

Vous avez cette idée de personne qui a répondu ceci: Sorted results from hbase scanner

Questions connexes