2016-12-20 4 views
0

ich bereit, die folgende Tabelle „keyspaceB.memobox“Bei Cassandra, ich weiß nicht, wie zu tun, BY

DROP TABLE IF EXISTS keyspaceB.memobox; 
CREATE TABLE IF NOT EXISTS keyspaceB.memobox (
    pkey1 text, 
    pkey2 text, 
    id timeuuid, 
    name text, 
    memo text, 
    date timestamp, 
    PRIMARY KEY ((pkey1, pkey2),id,name) 
) WITH CLUSTERING ORDER BY (id DESC,name DESC); 

Und ich folgende Daten registriert.

INSERT INTO memobox (pkey1,pkey2,id,name,memo,date) VALUES ('a','b',now(),'tanaka','greet message1','2016-12-13'); 
INSERT INTO memobox (pkey1,pkey2,id,name,memo,date) VALUES ('a','b',now(),'yamamoto','greet message2','2016-12-13'); 

wird die folgende

SELECT * FROM memobox where pkey1='a' and pkey2='b' ORDER BY id; 

jedoch Erfolg haben, wird die folgende scheitern. Ich möchte Ihren Professor fragen, was falsch ist.

SELECT * FROM memobox where pkey1='a' and pkey2='b' ORDER BY name; 

■ Fehler

cqlsh:keyspaceb> SELECT * FROM memobox where pkey1='a' and pkey2='b' ORDER BY name; 
InvalidRequest: code=2200 [Invalid query] message="Order by currently only support the ordering of columns following their declared order in the PRIMARY KEY" 
cqlsh:keyspaceb> 

Antwort

2

Es gibt zwei verschiedene Arten von Schlüsseln in cassandra, Partitionsschlüssel und Clustering-Schlüssel. Der Partitionsschlüssel legt fest, auf welchem ​​Knoten die Daten gespeichert werden, während der Clustering-Schlüssel die Reihenfolge bestimmt, in der die Daten in dieser Partition (Knoten) gespeichert werden. In Ihrem Fall ist der Partitionsschlüssel pkey1 und pkey2. und der Clusterschlüssel ist id und name.

so dass die Daten in einer Partition basierend auf dem id und dann name gespeichert werden.

z.B wenn wir die folgenden Daten

id |name 
1 | abc 
1 | xyz 
2 | aaa 

In diesem Fall wird die Zeile mit der ID 1 zunächst gespeichert ist, auch dann, wenn zwei Reihen haben die gleiche ID dann die Reihenfolge von Namen-Spalte festgelegt wird.

Also, wenn Sie abfragen, die Daten wie diese

SELECT * FROM memobox where pkey1='a' and pkey2='b' ORDER BY id; 

cassandra findet die partitoin mit pkey1 und pkey2 (auch bekannt als die Partition Schlüssel) und dann wieder nur die Daten, wie sie auf der Festplatte gespeichert ist.

jedoch im zweiten Fall

SELECT * FROM memobox where pkey1='a' and pkey2='b' ORDER BY name; 

, da die Daten nicht namentlich allein bestellt wird, (es zuerst von ID geordnet ist, und dann durch seinen Namen). Cassandra kann nicht einfach blind die Ergebnisse zurückgeben, es muss viel mehr tun, um die Ergebnisse richtig zu sortieren. Daher ist dies aus Leistungsgründen nicht erlaubt.

Aus diesem Grund müssen Sie in der order by-Klausel die Clusterspalten in der Reihenfolge angeben, in der Sie sie beim Erstellen der Tabelle (id und dann name) angeben. Diese

ist aus einer anderen Antwort von @aaron Where and Order By Clauses in Cassandra CQL

Cassandra erreicht Leistung durch die Clustering-Taste Ihre Daten auf der Festplatte zu sortieren, damit nur Rückgabe bestellter Zeilen in einer einzigen Lese (kein Zufall liest). Aus diesem Grund müssen Sie mit Cassandra einen abfragebasierten Modellierungsansatz (der Ihre Daten häufig in mehrere Abfragetabellen dupliziert) erstellen.Kennen Sie Ihre Abfragen im Voraus und erstellen Sie Ihre Tabellen, um sie zu bedienen.

+0

Danke für Ihre ausführliche Antwort !! Ich schätze. Es war sehr hilfreich. –

Verwandte Themen