2015-04-22 15 views
13

Ich bin neu mit Cassandra und ich traf ein Problem. Ich habe einen Keypace Demodb und eine Tabelle Benutzer erstellt. Diese Tabelle hat 3 Spalten: ID (int und Primärschlüssel), Vorname (varchar), Name (varchar). diese Anfrage mir das gute Ergebnis an:cassandra, wählen Sie über einen nicht primären Schlüssel

SELECT * FROM demodb.users WHERE id = 3; 

aber diese:

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

funktioniert nicht und ich erhalte die folgende Fehlermeldung:

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

auch Dieser Antrag doesn t arbeiten:

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." 

Vielen Dank im Voraus.

Antwort

12

auch diese Anfrage nicht funktioniert:

Das ist, weil Sie falsch zu verstehen sind, wie Sortierreihenfolge in Cassandra funktioniert. Statt eines Sekundärindex auf firstname verwenden, eine Tabelle speziell für diese Abfrage erstellen, wie folgt aus:

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

Diese Abfrage sollte jetzt funktionieren:

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

Hinweis, dass ich eine Verbindung Primärschlüssel erstellt haben auf firstname und id. Dadurch werden Ihre Daten unter firstname (so dass Sie sie abfragen können) partitioniert, während Ihre Daten auch unter id gruppiert werden. Standardmäßig werden Ihre Daten in aufsteigender Reihenfolge nach id gruppiert. Um dieses Verhalten zu ändern, können Sie eine CLUSTERING ORDER in Ihrer Tabellenerstellung Anweisung angeben:

WITH CLUSTERING ORDER BY (id DESC) 

... und dann werden Sie nicht einmal eine ORDER BY Klausel benötigen.

Ich schrieb vor kurzem einen Artikel darüber, wie Cluster-Reihenfolge in Cassandra funktioniert (We Shall Have Order). Es erklärt dies und behandelt auch einige Bestellstrategien.

+0

Vielen Dank für diese Informationen – mel

5

Es gibt eine Einschränkung in Cassandra: Jedes Feld, das Sie in der WHERE-Klausel verwenden möchten, muss der Primärschlüssel der Tabelle sein, oder es muss ein Sekundärindex darauf vorhanden sein. Sie müssen also einen Index für den Vornamen erstellen und erst danach können Sie den Vornamen in der WHERE-Bedingung verwenden und erhalten das Ergebnis, das Sie erwartet haben.

+0

für beide Anfragen? – mel

+0

für ID Sie bereits Primärschlüssel gegeben, so dass keine Notwendigkeit dafür. Index nur für Vorname erstellen. –

+1

Ich habe den Index für Vorname und jetzt: SELECT * FROM demodb.users WHERE Vorname = 'Francois'; funktionieren, aber ELECT * FROM Benutzer WHERE Vorname = 'Francois' ORDER BY ID DESC LIMIT 5; funktioniert immer noch nicht. – mel