2011-12-07 9 views
17

Sto cercando un esempio di codice per recuperare tutte le righe e tutte le colonne di una famiglia di colonne. Qualcosa di simile:Hector Cassandra: come recuperare tutte le righe di una famiglia di colonne?

SELECT * FROM MyTable 

vedo che questo può essere fatto utilizzando un RangeSlicesQuery, ma si devono ancora fornire un certo range. E penso che devi specificare anche i nomi delle colonne. C'è un modo pulito e sicuro per fare questo?

Utilizzo di Hector 1.0 e Cassandra 1.0.

risposta

15

provare qualcosa di simile:

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(); 
    } 
} 

Questa pagina volontà attraverso la famiglia colonna nella pagine di 100 righe. Recupererà solo 10 colonne per ogni riga (vorrai anche pagine molto lunghe).

Questo è per una famiglia di colonne con uuids per le chiavi di riga, stringhe per i nomi di colonna e long per valori. Spero che dovrebbe essere ovvio come cambiarlo.

+0

Grazie per la risposta. Ma questo è quello che ho fatto. Ho semplicemente impostato rangeSlicesQuery.setKeys ("", "") e non ho impostato alcun conteggio delle righe. Ciò ha restituito tutte le righe nella famiglia di colonne. Sembra che non ci sia bisogno di sfogliare le colonne. –

+0

Per continuare con il mio commento precedente, per farlo in quel modo, avevo bisogno di specificare i nomi delle colonne. –

+3

Sono abbastanza sicuro che Hector non implementa il paging per te. Probabilmente il tuo codice fallirà con un timeout (o peggio, causerà Cassandra in OOM) quando il set di dati diventerà più grande, poiché fare ciò che suggerisci fa sì che Cassandra carichi l'intero set di dati nella RAM. –

2

Prova questo fuori:

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(); 
    } 

} 
Problemi correlati