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
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
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
Les colonnes sont en effet triées. Voir: http://comments.gmane.org/gmane.comp.java.hadoop.hbase.user/24414 – jeffreyveon