2011-12-07 11 views
17

Estoy buscando un ejemplo de código para recuperar todas las filas y todas las columnas de una familia de columnas. Algo así como:Cassandra Hector: ¿Cómo recuperar todas las filas de una familia de columnas?

SELECT * FROM MyTable 

veo que esto se puede hacer usando un RangeSlicesQuery, pero todavía tiene que proporcionar un cierto rango. Y creo que también debes especificar los nombres de las columnas. ¿Hay una manera limpia y segura de hacer esto?

Uso de Hector 1.0 y Cassandra 1.0.

Respuesta

15

intentar algo como esto:

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

Esta página voluntad a través de la familia de columnas en las páginas de 100 filas. Solo obtendrá 10 columnas por cada fila (también querrá ubicar filas muy largas).

Esto es para una familia de columnas con uuids para claves de fila, cadenas para nombres de columna y anhela valores. Con suerte, debería ser obvio cómo cambiar esto.

+0

Gracias por su respuesta. Pero esto es lo que hice. Simplemente configuro rangeSlicesQuery.setKeys ("", "") y no configuro ningún recuento de filas. Esto devolvió todas las filas en la familia de columnas. Parece que no hay necesidad de recorrer las columnas. –

+0

Para continuar con mi comentario anterior, para hacerlo así, necesitaba especificar los nombres de las columnas. –

+3

Estoy bastante seguro de que Hector no implementa mensajes para usted. Es probable que su código falle con un tiempo de espera (o peor, cause que Cassandra cambie a OOM) cuando el conjunto de datos se agranda, ya que hacer lo que sugiere hace que Cassandra cargue todo el conjunto de datos en la RAM. –

2

Trate de hacer esto:

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

} 
Cuestiones relacionadas