tutorial - java cassandra ejemplo
Consultar columnas CompositeType en Cassandra usando Hector (1)
Buen tutorial de punto de partida aquí .
Pero, después de finalmente tener la necesidad de usar un componente compuesto y tratar de escribir consultas en contra de los datos, descubrí algunas cosas que quería compartir.
Al buscar columnas compuestas, los resultados serán un bloque contiguo de columnas.
Entonces, asumiendo como compuesto de 3 cadenas, y mis columnas se ven así:
A:A:A
A:B:B
A:B:C
A:C:B
B:A:A
B:B:A
B:B:B
C:A:B
Para una búsqueda de A: A: A a B: B: B, los resultados serán
A:A:A
A:B:B
A:B:C
A:C:B
B:A:A
B:B:A
B:B:B
Observe los componentes "C"? ¡No hay componentes "C" en los términos de inicio / finalización! ¿lo que da? Estos son todos los resultados entre las columnas A: A: A y B: B: B. Los términos de búsqueda compuesta no dan los resultados como si se tratara de procesar bucles anidados (esto es lo que originalmente pensé), sino que, como las columnas están ordenadas, está especificando los términos de inicio y final para un bloque contiguo de columnas .
Al compilar las entradas de búsqueda compuestas, debe especificar ComponentEquality
Solo el último término debe ser GREATER_THAN_EQUAL, todos los demás deben ser EQUAL. por ejemplo, para arriba
Composite start = new Composite();
start.addComponent(0, "A", Composite.ComponentEquality.EQUAL);
start.addComponent(1, "A", Composite.ComponentEquality.EQUAL);
start.addComponent(2, "A", Composite.ComponentEquality.EQUAL);
Composite end = new Composite();
end.addComponent(0, "B", Composite.ComponentEquality.EQUAL);
end.addComponent(1, "B", Composite.ComponentEquality.EQUAL);
end.addComponent(2, "B", Composite.ComponentEquality.GREATER_THAN_EQUAL);
SliceQuery<String, Composite, String> sliceQuery = HFactory.createSliceQuery(keyspace, se, ce, se);
sliceQuery.setColumnFamily("CF").setKey(myKey);
ColumnSliceIterator<String, Composite, String> csIterator = new ColumnSliceIterator<String, Composite, String>(sliceQuery, start, end, false);
while (csIterator.hasNext()) ....
Aquí hay una muestra del escenario que estoy enfrentando. Digamos que tengo esta familia de columnas:
create column family CompositeTypeCF
with comparator = ''CompositeType(IntegerType,UTF8Type)''
and key_validation_class = ''UTF8Type''
and default_validation_class = ''UTF8Type''
Aquí hay un ejemplo de código de Java con Hector sobre cómo insertar algunos datos en esta familia de columnas:
Cluster cluster = HFactory.getOrCreateCluster("Test Cluster", "192.168.1.6:9160");
Keyspace keyspaceOperator = HFactory.createKeyspace("CompositeTesting", cluster);
Composite colKey1 = new Composite();
colKey1.addComponent(1, IntegerSerializer.get());
colKey1.addComponent("test1", StringSerializer.get());
Mutator<String> mutator = HFactory.createMutator(keyspaceOperator, StringSerializer.get());
Mutator<String> addInsertion = mutator.addInsertion("rowkey1", "CompositeTypeCF",
HFactory.createColumn(colKey1, "Some Data", new CompositeSerializer(), StringSerializer.get()));
mutator.execute();
Esto funciona, y si voy al cassandra-cli y hago una lista, obtengo esto:
$ list CompositeTypeCF;
Using default limit of 100
-------------------
RowKey: rowkey1
=> (column=1:test1, value=Some Data, timestamp=1326916937547000)
Mi pregunta ahora es esta: ¿cómo hago para consultar estos datos en Hector? Básicamente, necesitaría consultarlo de varias maneras:
- Dame toda la fila donde Row Key = "rowkey1"
- Dame los datos de la columna donde la primera parte del nombre de la columna = algún valor entero
- Dame todas las columnas donde la primera parte del nombre de la columna se encuentra dentro de un cierto rango