2013-07-18 7 views
7

Voglio interrogare il filtraggio dei dati con chiavi composite diverse da Row Key in CQL3. Queste sono le mie domande:Query utilizzando chiavi composite diverse da Row Key in Cassandra

CREATE TABLE grades (id int, 
    date timestamp, 
    subject text, 
    status text, 
    PRIMARY KEY (id, subject, status, date) 
); 

Quando provo e accedere ai dati,

SELECT * FROM grades where id = 1098; //works fine 
SELECT * FROM grades where subject = 'English' ALLOW FILTERING; //works fine 
SELECT * FROM grades where status = 'Active' ALLOW FILTERING; //gives an error 

Bad Request: PRIMARY KEY stato parte non può essere limitato (precedente parte soggetto o non è limitato o da un non-EQ relazione)

semplicemente sperimentare, ho SHUF fuggi le chiavi per mantenere "id" come sempre la mia Primary Row Key. Sono sempre in grado di eseguire query utilizzando la chiave della riga principale o la seconda chiave, considerando l'esempio precedente, se scambio gli oggetti e lo stato nell'elenco delle chiavi primarie, posso quindi eseguire una query con lo stato ma ottengo un errore simile se provo a farlo soggetto o dal tempo.

Sto facendo qualcosa di sbagliato? Non posso interrogare i dati utilizzando qualsiasi altra chiave composita in CQL3? Sto usando Cassandra 1.2.6 e CQL3.

risposta

12

Sembra tutto normale comportamento in base al modello Cassandra Composite Key (http://www.datastax.com/docs/1.2/cql_cli/cql/SELECT). Gli obiettivi del modello di dati di Cassandra (e questo è un modo di pensare NoSQL generale) nel garantire che le query siano performanti, ciò va a scapito delle "restrizioni" sul modo in cui memorizzi e indicizzi i tuoi dati, e in che modo lo interroghi, cioè tu "sempre necessario limitare la parte precedente dell'oggetto" sulla chiave primaria.

Non è possibile scambiare elementi nell'elenco delle chiavi primarie sulle query (è più un modo di pensare SQL). È sempre necessario "Vincolare"/"Limitare" l'elemento precedente della chiave primaria se si utilizzano più elementi della chiave composita. Ciò significa che se hai una chiave composta = (id, oggetto, stato, data) e vuoi interrogare "status", dovrai limitare "id" e/o "subject" ("o" è possibile nel caso tu usi "Consenti filtraggio", ovvero puoi limitare solo "oggetto" e non è necessario limitare "id"). Pertanto, se desideri eseguire una query su "stato", puoi eseguire la query in due modi diversi:

selezionare * da gradi dove id = '1093' e oggetto = 'inglese' e stato = 'Attivo' ;

O

select * from gradi dove subject = 'inglese' e status = 'attivo' permette di filtrare;

Il primo è per uno specifico "studente", il secondo per tutti gli "studenti" sull'oggetto in stato = "Attivo".

+0

bella spiegazione! –

+0

Capito! Grazie, per me ha molto più senso ora. Immagino che continuerò a ripetere le mie domande e vedrò come voglio strutturarle poiché non sempre ho bisogno di limitare l'argomento per poter ottenere lo stato. – user988544

+0

Mi ha aiutato molto! Grazie – kn0x

Problemi correlati