Die Cassandra-IN-Abfrage funktioniert nicht, wenn die Tabelle eine Spalte vom Typ SET enthält

9

Ich bin neu in Cassandra. Ich habe ein Problem in CQL IN query , wenn Tabelle hat SET-Typ Spalte funktioniert es.

%Vor%

Aber wenn ich tags set oben hinzufüge, gibt es einen Fehler

%Vor%
  

code = 2200 [Ungültige Abfrage] message="Die Spalte" test_id "kann nicht durch eingeschränkt werden   IN Beziehung als eine Sammlung wird durch die Abfrage "

" ausgewählt
    
navy 02.02.2015, 12:53
quelle

3 Antworten

2
___ answer28279543 ​​___

Ich bin nicht sicher, warum diese Einschränkung besonders für Sammlungen gelten sollte. Aber in Ihrem Fall können Sie dieses Problem umgehen, indem Sie test_id als Teil Ihres Partitionsschlüssels verwenden:

PRIMARY KEY((test_date,test_id))

Damit können Sie IN-Abfragen ausführen, solange Sie den ersten Teil des zusammengesetzten Schlüssels (test_date) angeben.

    
___ qstntxt ___

Ich bin neu in Cassandra. Ich habe ein Problem in %code% , wenn Tabelle hat SET-Typ Spalte funktioniert es.

%Vor%

Aber wenn ich tags set oben hinzufüge, gibt es einen Fehler

%Vor%
  

code = 2200 [Ungültige Abfrage] message="Die Spalte" test_id "kann nicht durch eingeschränkt werden   IN Beziehung als eine Sammlung wird durch die Abfrage "

" ausgewählt
    
___ answer28282845 ___

Ich denke, Sie sehen diesen Fehler aufgrund des zugrunde liegenden Speichermodells von Cassandra. Wenn ich Ihre %code% -Tabelle in CQLSH abfrage (mit meinen eigenen Testdaten), sehe ich Folgendes:

%Vor%

Diese Ansicht gibt eine irreführende Interpretation darüber, wie die Daten tatsächlich gespeichert werden. So sieht es aus, wenn ich die gleiche Tabelle innerhalb von cassandra-cli abfrage:

%Vor%

Dies legt nahe, dass Sammlungs (set) -Werte als zusätzliche Spaltenschlüssel gespeichert werden. Eine Einschränkung bei der Verwendung der Beziehung %code% besteht darin, dass sie mit dem letzten Schlüssel (Partitionierung oder Clustering) eines Primärschlüssels arbeiten muss. Ich nehme an, dass dies eine Einschränkung ist, die darauf beruht, wie Cassandra die Sammlungsdaten "unter der Haube" speichert.

Und nur eine Warnung, aber die Verwendung von %code% für Abfragen auf Produktionsebene wird nicht empfohlen. Einige sind sogar so weit gegangen, es auf die Liste der Cassandra-Anti-Patterns zu setzen. Meine Antwort auf diese Frage ( Ist IN Beziehung in Cassandra schlecht für Abfragen? ) erklärt warum %code% Abfragen nicht optimal sind.

BEARBEITEN

Nur um zu sehen, habe ich Ihr Schema mit einer Liste anstatt einer Menge ausprobiert, um zu sehen, ob das irgendeinen Unterschied machte. Es immer noch nicht funktioniert, sondern aus dem cassandra-cli es erschien eine zusätzliche UUID-Kennung zu dem Schlüssel hinzuzufügen, und den tatsächlichen Wert als Spaltenwert gespeichert. Was sich von der Behandlung eines Sets unterscheidet, muss sein, wie Sets auf eindeutige Werte beschränkt sind.

    
___ qstnhdr ___ Die Cassandra-IN-Abfrage funktioniert nicht, wenn die Tabelle eine Spalte vom Typ SET enthält ___ answer38882690 ___

Sie können eine materialisierte Ansicht mit test_id als Teil des Partitionierungsausdrucks verwenden, um Ihre Anforderung zu erfüllen, wenn das Ändern der PK in Ihrer Basistabelle keine Option ist:

%Vor%

Verwenden Sie dann die materialisierte Ansicht anstelle der Basistabelle in Ihrer Abfrage:

%Vor%     
___ tag123cassandra ___ Cassandra ist ein hochskalierbarer, schließlich konsistenter, verteilter, strukturierter Zeilen- / Spaltenspeicher. ___ tag123cql ___ CQL (Cassandra Query Language) wird verwendet, um mit Cassandra-Tabellen zu interagieren und diese abzufragen. Die Syntax ähnelt der von SQL und trägt dazu bei, die Lernkurve für die Arbeit mit Cassandra zu verringern. Verwenden Sie für die Abfragesprache des Cypher-Diagramms das cypher-Tag. ___
Stefan Podkowinski 02.02.2015 14:07
quelle
2

Ich denke, Sie sehen diesen Fehler aufgrund des zugrunde liegenden Speichermodells von Cassandra. Wenn ich Ihre test1 -Tabelle in CQLSH abfrage (mit meinen eigenen Testdaten), sehe ich Folgendes:

%Vor%

Diese Ansicht gibt eine irreführende Interpretation darüber, wie die Daten tatsächlich gespeichert werden. So sieht es aus, wenn ich die gleiche Tabelle innerhalb von cassandra-cli abfrage:

%Vor%

Dies legt nahe, dass Sammlungs (set) -Werte als zusätzliche Spaltenschlüssel gespeichert werden. Eine Einschränkung bei der Verwendung der Beziehung IN besteht darin, dass sie mit dem letzten Schlüssel (Partitionierung oder Clustering) eines Primärschlüssels arbeiten muss. Ich nehme an, dass dies eine Einschränkung ist, die darauf beruht, wie Cassandra die Sammlungsdaten "unter der Haube" speichert.

Und nur eine Warnung, aber die Verwendung von IN für Abfragen auf Produktionsebene wird nicht empfohlen. Einige sind sogar so weit gegangen, es auf die Liste der Cassandra-Anti-Patterns zu setzen. Meine Antwort auf diese Frage ( Ist IN Beziehung in Cassandra schlecht für Abfragen? ) erklärt warum IN Abfragen nicht optimal sind.

BEARBEITEN

Nur um zu sehen, habe ich Ihr Schema mit einer Liste anstatt einer Menge ausprobiert, um zu sehen, ob das irgendeinen Unterschied machte. Es immer noch nicht funktioniert, sondern aus dem cassandra-cli es erschien eine zusätzliche UUID-Kennung zu dem Schlüssel hinzuzufügen, und den tatsächlichen Wert als Spaltenwert gespeichert. Was sich von der Behandlung eines Sets unterscheidet, muss sein, wie Sets auf eindeutige Werte beschränkt sind.

    
Aaron 02.02.2015 17:01
quelle
0

Sie können eine materialisierte Ansicht mit test_id als Teil des Partitionierungsausdrucks verwenden, um Ihre Anforderung zu erfüllen, wenn das Ändern der PK in Ihrer Basistabelle keine Option ist:

%Vor%

Verwenden Sie dann die materialisierte Ansicht anstelle der Basistabelle in Ihrer Abfrage:

%Vor%     
Mykola Dolgalov 10.08.2016 20:13
quelle

Tags und Links