2012-01-18 13 views
13

Aquí hay una muestra de la situación que estoy enfrentando. Decir que tengo esta familia columna:Consultando columnas CompositeType en Cassandra usando Hector

create column family CompositeTypeCF 
    with comparator = 'CompositeType(IntegerType,UTF8Type)' 
    and key_validation_class = 'UTF8Type' 
    and default_validation_class = 'UTF8Type' 

He aquí algunos ejemplos de código Java con Héctor en cuanto a cómo me gustaría ir sobre la inserción de algunos datos en esta familia la columna:

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 ir a la cassandra-CLI y hacer una lista me sale esto:

$ list CompositeTypeCF; 

Using default limit of 100 
------------------- 
RowKey: rowkey1 
=> (column=1:test1, value=Some Data, timestamp=1326916937547000) 

Mi pregunta ahora es: ¿Cómo hago para consultar estos datos en Hector? Básicamente que tendría que consultar en algunas de las formas:

  1. Dame toda la fila en la fila de clave = "rowkey1"
  2. Dame los datos de columna en la primera parte del nombre de columna = algún valor entero
  3. Dame todas las columnas en las que la primera parte del nombre de la columna se encuentra dentro de un cierto rango

Respuesta

13

punto de partida Buen tutorial here.

Pero, después de finalmente tener la necesidad de usar un componente compuesto e intentar escribir consultas contra los datos, descubrí algunas cosas que quería compartir.

Al buscar columnas compuestas, los resultados serán un bloque contiguo de columnas.

Así, asumiendo como compuesta de 3 cuerdas, y mis columnas aspecto:

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 la A: A: de 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 

¿Observa 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 compuestos no dan los resultados como si procesaran bucles anidados (esto es lo que originalmente pensé), sino más bien, dado que las columnas están ordenadas, está especificando los términos de inicio y final para un bloque contiguo de columnas.

Cuando la construcción de las Compuestas entradas de búsqueda, debe especificar el ComponentEquality

Sólo el último término debe ser GREATER_THAN_EQUAL, todos los demás deben ser iguales. p.ej. 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()) .... 
+1

¿Puede explicar por qué necesitamos GREATER_THAN_EQUAL en el último componente? Revisé el artículo, pero las cosas aún no están claras. –

+0

¡He formulado esta pregunta por separado para que pueda recompensarlos! –

+0

No sé, experimenté con un código de muestra para convencerme de que funcionaba para lo que necesitaba. – libjack

Cuestiones relacionadas