Cassandra Error - Clustering-Spalte kann nicht eingeschränkt werden (die vorherige Spalte ist durch eine Nicht-EQ-Beziehung eingeschränkt)

10

Wir verwenden Cassandra als Datenhistoriker für unsere Flottenmanagementlösung. Wir haben einen Tisch in Cassandra, in dem die Einzelheiten der Fahrt mit dem Fahrzeug gespeichert sind. Die Tabellenstruktur ist wie folgt

%Vor%

Wo:

  1. bucketid: - Partitionsschlüssel, der eine Kombination aus Monat und Jahr ist
  2. Fahrzeug-ID: -eine eindeutige ID des Fahrzeugs
  3. starttime: - Startzeit der Reise
  4. endtime: - Endzeit der Reise
  5. Reisedauer: - Reisedauer in Millisekunden

Wir möchten die folgende Abfrage ausführen - alle Reisen eines Fahrzeugs abrufen - 1234567 zwischen dem 1.12.2015 und dem 3.12.2015, deren Reisedauer mehr als 30 Minuten beträgt

Wenn ich diese Abfrage ausführen:

%Vor%

Ich bekomme dieses Ergebnis:

%Vor%

Hat jemand eine Empfehlung, wie Sie dieses Problem beheben können?

    
sam1977 22.12.2015, 18:47
quelle

1 Antwort

16
%Vor%

Das wird nicht funktionieren. Der Grund liegt darin, wie Cassandra Daten auf der Festplatte speichert. Die Idee mit Cassandra ist, dass es sehr effizient ist, eine einzelne Zeile mit einem präzisen Schlüssel zurückzugeben oder einen kontinuierlichen Bereich von Zeilen von der Platte zurückzugeben.

Ihre Zeilen werden durch bucketid partitioniert und dann auf dem Datenträger nach vehicleid , starttime und travelduration sortiert. Da Sie in starttime bereits eine Bereichsabfrage (Nicht-EQ-Beziehung) ausführen, können Sie den folgenden Schlüssel nicht einschränken. Dies liegt daran, dass die Einschränkung travelduration möglicherweise einige der Zeilen in Ihrer Bereichsbedingung disqualifiziert. Dies würde zu einem ineffizienten, nicht fortlaufenden Lesen führen. Cassandra wurde entwickelt, um Sie davor zu schützen, Anfragen (wie diese) zu schreiben, die eine unvorhersehbare Leistung haben könnten.

Hier sind zwei Alternativen:

1- Wenn Sie alle Schlüsselspalten vor travelduration (mit einer equals-Beziehung) einschränken könnten, könnten Sie eine Größer-als-Bedingung anwenden:

%Vor%

Natürlich ist die Beschränkung auf ein genaues starttime möglicherweise nicht sehr nützlich.

2- Ein anderer Ansatz wäre, travelduration ganz wegzulassen, und dann würde Ihre ursprüngliche Abfrage funktionieren.

%Vor%

Leider bietet Cassandra keine große Flexibilität bei der Abfrage. Viele Leute haben Erfolg mit einer Lösung wie Spark (neben Cassandra) gefunden, um diese Ebene der Berichterstattung zu erreichen.

Und nur eine Randnotiz, aber verwenden Sie IN nicht, es sei denn Sie müssen. Das Abfragen mit IN ähnelt der Verwendung eines sekundären Index, da Cassandra mit mehreren Knoten kommunizieren muss, um Ihre Abfrage zu erfüllen. Es mit einem einzigen Gegenstand zu nennen, ist wahrscheinlich nicht zu groß. Aber IN ist eine dieser alten RDBMS-Gewohnheiten, die Sie wirklich brechen sollten, bevor Sie zu tief in Cassandra eintauchen.

    
Aaron 22.12.2015, 21:04
quelle