Cassandra Hector: ¿Cómo recuperar todas las filas de una familia de columnas?
(2)
Intenta 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();
}
}
Esto se desplazará a través de la familia de columnas en páginas de 100 filas. Solo recuperará 10 columnas para cada fila (también querrá paginar filas muy largas).
Esto es para una familia de columnas con uuids para claves de fila, cadenas para nombres de columnas y largos para valores. Esperemos que sea obvio cómo cambiar esto.
Estoy buscando un ejemplo de código para recuperar todas las filas y todas las columnas de una familia de columnas. Algo como:
SELECT * FROM MyTable
Veo que esto se puede hacer usando un RangeSlicesQuery, pero todavía tiene que proporcionar un cierto rango. Y creo que tienes que especificar los nombres de columna también. ¿Hay una manera limpia y segura de hacer esto?
Usando Hector 1.0 y Cassandra 1.0.
Probar 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();
}
}