2011-12-07 7 views
17

Je cherche un exemple de code pour récupérer toutes les lignes et toutes les colonnes d'une famille de colonnes. Quelque chose comme:Cassandra Hector: Comment récupérer toutes les lignes d'une famille de colonnes?

SELECT * FROM MyTable 

Je vois que cela peut être fait en utilisant un RangeSlicesQuery, mais vous devez toujours fournir une certaine gamme. Et je pense que vous devez aussi spécifier les noms de colonnes. Y a-t-il un moyen propre et sûr de le faire?

En utilisant Hector 1.0 et Cassandra 1.0.

Répondre

15

Essayez quelque chose comme ceci:

public class Dumper { 
    private final Cluster cluster; 
    private final Keyspace keyspace; 

    public Dumper() { 
     this.cluster = HFactory.getOrCreateCluster("Name", "hostname"); 
     this.keyspace = HFactory.createKeyspace("Keyspace", cluster, new QuorumAllConsistencyLevelPolicy()); 
    } 

    public void run() { 
     int row_count = 100; 

     RangeSlicesQuery<UUID, String, Long> rangeSlicesQuery = HFactory 
      .createRangeSlicesQuery(keyspace, UUIDSerializer.get(), StringSerializer.get(), LongSerializer.get()) 
      .setColumnFamily("Column Family") 
      .setRange(null, null, false, 10) 
      .setRowCount(row_count); 

     UUID last_key = null; 

     while (true) { 
      rangeSlicesQuery.setKeys(last_key, null); 
      System.out.println(" > " + last_key); 

      QueryResult<OrderedRows<UUID, String, Long>> result = rangeSlicesQuery.execute(); 
      OrderedRows<UUID, String, Long> rows = result.get(); 
      Iterator<Row<UUID, String, Long>> rowsIterator = rows.iterator(); 

      // we'll skip this first one, since it is the same as the last one from previous time we executed 
      if (last_key != null && rowsIterator != null) rowsIterator.next(); 

      while (rowsIterator.hasNext()) { 
       Row<UUID, String, Long> row = rowsIterator.next(); 
       last_key = row.getKey(); 

       if (row.getColumnSlice().getColumns().isEmpty()) { 
       continue; 
       } 


       System.out.println(row); 
      } 

      if (rows.getCount() < row_count) 
       break; 
     } 
    } 

    public static void main(String[] args) { 
     new Dumper().run(); 
    } 
} 

Cette page permet de faire défiler la famille de la colonne dans les pages de 100 lignes. Il ne récupérera que 10 colonnes pour chaque ligne (vous voudrez aussi lire des lignes très longues).

Ceci s'applique à une famille de colonnes avec des uuids pour les clés de ligne, des chaînes pour les noms de colonnes et des valeurs longues pour les valeurs. Espérons qu'il devrait être évident comment changer cela.

+0

Merci pour votre réponse. Mais c'est ce que j'ai fait. Je définis simplement rangeSlicesQuery.setKeys ("", "") et je ne définis aucun nombre de lignes. Cela a renvoyé toutes les lignes dans la famille de colonnes. Il semble qu'il n'y ait pas besoin de feuilleter les colonnes. –

+0

Pour continuer avec mon commentaire précédent, pour le faire comme ça, j'avais besoin de spécifier les noms des colonnes. –

+3

Je suis sûr que Hector n'implémente pas la pagination pour vous. Votre code échouera probablement avec un timeout (ou pire, causera Cassandra à OOM) quand votre dataset sera plus grand, car faire ce que vous suggérez à Cassandra de charger l'ensemble de données dans la RAM. –

2

Essayez ceci:

int rowCount = MAX; 
    RangeSlicesQuery<String, String, String> rangeSlicesQuery = HFactory 
      .createRangeSlicesQuery(keyspace2, STRINGSERIALIZER, 
        STRINGSERIALIZER, STRINGSERIALIZER) 
      .setColumnFamily(columnFamily) 
      .setRange(null, null, false, rowCount).setRowCount(rowCount); 
    String lastKey = null; 
    // Query to iterate over all rows of cassandra Column Family 
    rangeSlicesQuery.setKeys(lastKey, null); 
    QueryResult<OrderedRows<String, String, String>> result = rangeSlicesQuery 
      .execute(); 
    OrderedRows<String, String, String> rows = result.get(); 
    for (Row<String, String, String> row : rows) { 
     String cassandra_key = row.getKey(); 
    } 

} 
Questions connexes