2012-01-18 11 views
13

Ecco un esempio dello scenario che sto affrontando. Dire che ho questa colonna la famiglia:Interrogazione di colonne CompositeType in Cassandra con Hector

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

Ecco alcuni esempi di codice Java utilizzando Hector su come mi piacerebbe andare sull'inserimento di alcuni dati in questa colonna la famiglia:

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

questo funziona, e se io andare al cassandra-cli e fare una lista ottengo questo:

$ list CompositeTypeCF; 

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

la mia domanda ora è questa: come posso fare per l'interrogazione di questi dati a Hector? In pratica avrei bisogno di interrogare in alcuni modi:

  1. Dammi l'intera riga in cui Row Key = "rowkey1"
  2. Dammi i dati della colonna in cui la prima parte del nome della colonna = un certo valore intero
  3. Dammi tutte le colonne dove la prima parte del nome della colonna è entro un certo intervallo

risposta

13

Buon punto di partenza esercitazione here.

Ma, dopo aver finalmente avuto la necessità di utilizzare un componente composito e tentare di scrivere query sui dati, ho scoperto alcune cose che volevo condividere.

Durante la ricerca di colonne composte, i risultati saranno un blocco contiguo di colonne.

Quindi, assumendo come composto di 3 stringhe, e le mie colonne simile:

A:A:A 
A:B:B 
A:B:C 
A:C:B 
B:A:A 
B:B:A 
B:B:B 
C:A:B 

Per una ricerca da A: A: A a B: B: B, i risultati saranno

A:A:A 
A:B:B 
A:B:C 
A:C:B 
B:A:A 
B:B:A 
B:B:B 

Avviso i componenti "C"? Non ci sono componenti "C" nei termini di inizio/fine! cosa dà? Questi sono tutti i risultati tra le colonne A: A: A e B: B: B. I termini di ricerca compositi non corrispondono a come risultato dell'elaborazione di cicli nidificati (questo è ciò che inizialmente avevo pensato), ma piuttosto, poiché le colonne sono ordinate, si specificano i termini di inizio e fine per un blocco contiguo di colonne.

Quando si costruisce le voci di ricerca composite, è necessario specificare il ComponentEquality

Solo l'ultimo termine dovrebbero essere GREATER_THAN_EQUAL, tutti gli altri dovrebbero essere uguali. per esempio. per sopra

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

puoi approfondire perché abbiamo bisogno di GREATER_THAN_EQUAL nell'ultimo componente? Ho esaminato l'articolo, ma le cose non sono ancora chiare. –

+0

Ho chiesto questo come una domanda separata in modo da poter premiare i tuoi punti! –

+0

Non so, ho provato un codice di esempio per convincermi che ha funzionato per ciò di cui avevo bisogno. – libjack

Problemi correlati