2014-02-21 9 views
9

Frage an alle Cassandra Experten da draußen.Cassandra NOT EQUAL Operator

Ich habe eine Spaltenfamilie mit etwa einer Million Datensätze.

Ich möchte diese Datensätze so abfragen, dass ich in der Lage sein sollte, eine Not-Equal-To Art von Operation durchzuführen.

Ich googelte auf diesem und es scheint, dass ich eine Art von Map-Reduce verwenden muss.

Kann mir jemand sagen, welche Optionen in dieser Hinsicht verfügbar sind.

Antwort

11

Ich kann ein paar Ansätze vorschlagen.

1) Wenn Sie eine begrenzte Anzahl von Werten haben, die Sie auf Nichtgleichheit prüfen möchten, sollten Sie diese als boolean Spalten modellieren (d. H. Spalte isEqualToUnitedStates mit True oder False).

2) Andernfalls emulieren Sie die nicht unterstützte Abfrage != X, indem Sie die Ergebnisse der beiden separaten Abfragen < X und > X auf der Clientseite kombinieren.

3) Wenn Ihr Schema keine der beiden oben genannten Abfragetypen unterstützt, müssen Sie möglicherweise auf das Schreiben von benutzerdefinierten Routinen zurückgreifen, die clientseitige Filterung durchführen und das ungleiche Set dynamisch erstellen. Dies funktioniert, wenn Sie zunächst Ihren Suchraum auf überschaubare Proportionen eingrenzen können, so dass es relativ günstig ist, die Suchanfrage ohne das Ungleiche auszuführen.

Nehmen wir an, Sie interessieren sich für alle Käufe eines bestimmten Kunden jedes Produkttyps außer Widget. Eine ideale Abfrage könnte etwa so aussehen: SELECT * FROM purchases WHERE customer = 'Bob' AND item != 'Widget'; Nun können Sie das natürlich nicht ausführen, aber in diesem Fall sollten Sie SELECT * FROM purchases WHERE customer = 'Bob' ausführen können, ohne zu viele Ressourcen zu verschwenden und item != 'Widget' in der Client-Anwendung zu filtern.

4) Schließlich, wenn es keine Möglichkeit gibt, die Daten auf eine sinnvolle Weise einzuschränken, bevor Sie den Scan durchführen (Abfragen ohne die Gleichheitsüberprüfung würde zu viele Zeilen zurückgeben, um bequem zu behandeln), müssen Sie möglicherweise MapReduce verwenden. Dies bedeutet, dass ein verteilter Job ausgeführt wird, der alle Zeilen in der Tabelle über den Cluster hinweg scannt. Solche Jobs laufen natürlich wesentlich langsamer als native Abfragen und sind sehr komplex einzurichten. Wenn Sie diesen Weg gehen möchten, schauen Sie bitte in Cassandra Hadoop Integration.