2015-04-22 19 views
13

Sono nuovo con cassandra e ho incontrato un problema. Ho creato un demodb di keyspace e un utente di una tabella. Questa tabella ha 3 colonne: id (int e chiave primaria), firstname (varchar), name (varchar). questa richiesta mi mandi il buon risultato:cassandra, selezionare tramite una chiave non primaria

SELECT * FROM demodb.users WHERE id = 3; 

ma questo:

SELECT * FROM demodb.users WHERE firstname = 'francois'; 

non funziona e ricevo il seguente messaggio di errore:

InvalidRequest: code=2200 [Invalid query] message="No secondary indexes on the restricted columns support the provided operators: " 

questa richiesta anche doesn funziona:

SELECT * FROM users WHERE firstname = 'francois' ORDER BY id DESC LIMIT 5; 
InvalidRequest: code=2200 [Invalid query] message="ORDER BY with 2ndary indexes is not supported." 

Grazie in anticipo.

risposta

12

questa richiesta anche non funziona:

Questo perché si è mis-capire come funziona un sistema di classificazione a Cassandra. Invece di utilizzare un indice secondario su firstname, creare una tabella appositamente per questa query, in questo modo:

CREATE TABLE usersByFirstName (
    id int, 
    firstname text, 
    lastname text, 
    PRIMARY KEY (firstname,id)); 

Questa query dovrebbe ora funzionare:

SELECT * FROM usersByFirstName WHERE firstname='francois' 
ORDER BY id DESC LIMIT 5; 

nota, che ho creato una chiave primaria composta su firstname e id. Questa operazione partiziona i dati su firstname (consentendo di eseguire una query da esso), mentre raggruppa anche i dati per id. Per impostazione predefinita, i dati verranno raggruppati in id in ordine crescente. Per modificare questo comportamento, è possibile specificare un CLUSTERING ORDER nella vostra dichiarazione creazione della tabella:

WITH CLUSTERING ORDER BY (id DESC) 

... e allora non avrete nemmeno bisogno di una clausola ORDER BY.

Ho recentemente scritto un articolo su come funziona l'ordine di raggruppamento in Cassandra (We Shall Have Order). Lo spiega e copre anche alcune strategie di ordinazione.

+0

Grazie mille per queste informazioni – mel

5

C'è un vincolo in cassandra: qualsiasi campo che si desidera utilizzare nella clausola where deve essere la chiave primaria della tabella o deve esserci un indice secondario. Quindi devi creare un indice per il nome e solo dopo puoi usare il nome nella condizione where e otterrai il risultato che ti aspettavi.

+0

per entrambe le richieste? – mel

+0

per l'ID che hai già fornito con la chiave primaria, quindi non è necessario. crea un indice solo per nome. –

+1

Ho creato l'indice per nome e ora: SELECT * FROM demodb.users WHERE firstname = 'francois'; funziona ma ELECT * DA utenti WHERE firstname = 'francois' ORDINA PER id DESC LIMIT 5; non funziona ancora. – mel