2016-02-17 14 views
6

Ich möchte die letzte Zeile in Cassandra Tabelle eingefügt werden. Wie bekomme ich es? Irgendeine Idee?Wie wird die letzte Zeile in Cassandra eingefügt?

Ich entwickle ein Projekt für das ich mysql durch Cassandra ersetze. Ich möchte alle SQL-Abfragen loswerden und sie alle in Cassandra schreiben.

+0

In jeder Clusterumgebung ist es praktisch unmöglich, den zuletzt eingefügten Eintrag zu bestimmen. Cassandra ist keine Ausnahme. –

+0

Für Cassandra Leute: das Konzept der "letzten eingefügten Reihe" in MySQL ist tatsächlich die (Autoinkrement) Identifikation der Reihe, die gerade von Ihrem Klienten über eine INSERT Aussage eingesetzt wurde. Dies ist ein echtes Problem in Cassandra, wenn zum Beispiel Ihr Primärschlüssel ein 'timeuuid' ist und Sie die' now() 'Funktion verwenden, um automatisch den Wert für die neue Zeile zu erzeugen. Es gibt offensichtlich keine Möglichkeit, die Zeit für die neue Zeile zu bestimmen, auch wenn das dem Fahrer leicht hinzuzufügen ist. – Shannon

Antwort

2

Ich möchte die letzte Zeile in Cassandra Tabelle eingefügt werden. Wie bekomme ich es? Irgendeine Idee?

Es ist nicht möglich, was Sie verlangen, ist eine Warteschlange Muster (gib mir letzte Meldung in) und die Warteschlange ist ein bekanntes anti-Muster für Cassandra

8

einfach ein wenig Verständnis zu vermitteln. ..

Wie bei allen Cassandra-Abfrageproblemen muss die Abfrage nach einem speziell dafür entwickelten Modell ausgeführt werden. Dies wird als abfragebasierte Modellierung bezeichnet. Das Abfragen der zuletzt eingefügten Zeile ist keine in jeder Tabelle integrierte Fähigkeit. Sie müssten Ihr Modell so entwerfen, dass es dies im Voraus unterstützt.

Zum Beispiel, sagen wir, ich habe eine Tabelle, die Daten für Benutzer speichert.

CREATE TABLE users (
    username TEXT, 
    email TEXT, 
    firstname TEXT, 
    lastname TEXT, 
    PRIMARY KEY (username)); 

Wenn ich ein SELECT * FROM users LIMIT 1 auf diesem Tisch laufen bin, meine Ergebnismenge eine einzelne Zeile enthalten würde. Diese Zeile wäre diejenige mit dem niedrigsten Hash-Wert von username (mein Partitionsschlüssel), weil Cassandra so Daten im Cluster speichert. Ich hätte keine Möglichkeit zu wissen, ob es das letzte war oder nicht, also wäre das für dich nicht sehr nützlich.

Auf der anderen Seite, lassen Sie mich sagen, ich hatte eine Tabelle entwickelt, um Updates zu verfolgen, die Benutzer auf ihre Kontoinformationen gemacht hatten.

CREATE TABLE userUpdates (
    username TEXT, 
    lastUpdated TIMEUUID, 
    email TEXT, 
    firstname TEXT, 
    lastname TEXT, 
    PRIMARY KEY (username,lastUpdated)) 
WITH CLUSTERING ORDER BY (lastUpdated DESC); 

nächstes werde ich 3 Reihen UPSERT:

> INSERT INTO userUpdates (username,lastUpdated,email,firstname,lastname) 
    VALUES ('bkerman',now(),'[email protected]','Bob','Kerman'); 
> INSERT INTO userUpdates (username,lastUpdated,email,firstname,lastname) 
    VALUES ('jkerman',now(),'[email protected]','Jebediah','Kerman'); 
> INSERT INTO userUpdates (username,lastUpdated,email,firstname,lastname) 
    VALUES ('bkerman',now(),'[email protected]','Bob','Kerman'); 

> SELECT username, email, dateof(lastUpdated) FROM userupdates; 

username | email    | system.dateof(lastupdated) 
----------+-------------------+---------------------------- 
    jkerman | [email protected] | 2016-02-17 15:31:39+0000 
    bkerman | [email protected] | 2016-02-17 15:32:22+0000 
    bkerman | [email protected] | 2016-02-17 15:31:38+0000 

(3 rows) 

Wenn ich SELECT username, email, dateof(lastUpdated) FROM userupdates LIMIT 1 nur, ich werde Jedediah Kerman Daten bekommen, was nicht der zuletzt aktualisierten ist. Wenn ich jedoch meine Partition auf username='bkerman' begrenze, bekomme ich mit LIMIT 1 die neueste Zeile für Bob Kerman.

> SELECT username, email, dateof(lastUpdated) FROM userupdates WHERE username='bkerman' LIMIT 1; 

username | email    | system.dateof(lastupdated) 
----------+-------------------+---------------------------- 
    bkerman | [email protected] | 2016-02-17 15:32:22+0000 

(1 rows) 

Dies funktioniert, weil ich eine Clustering-Reihenfolge der angegeben auf lastUpdated absteigend:

WITH CLUSTERING ORDER BY (lastUpdated DESC); 

Auf diese Weise Ergebnisse innerhalb jeder Partition werden auf dem mit der meist kürzlich upserted Zeile zurückgegeben werden top, daher LIMIT 1 wird der Weg, die letzte Zeile abzufragen.

Zusammenfassend ist es wichtig zu verstehen, dass: durch den Hash-Wert einer Partition Schlüssel

  • Cassandra Aufträge Daten im Cluster. Dies trägt zu einer gleichmäßigeren Datenverteilung bei.
  • Cassandra CLUSTERING ORDER erzwingt auf der Festplatte Sortierreihenfolge der Daten innerhalb einen Partitionsschlüssel.
  • Während Sie nicht in der Lage sein werden, für jede Tabelle, die die am meisten kürzlich upserted Reihe zu bekommen, Sie können Design-Modelle, diese Zeile zu Ihnen für jede Partition zurückzukehren.

tl; dr; Abfrage in Cassandra unterscheidet sich sehr von der von MySQL oder RDBMS. Wenn Sie die letzte Zeile (für eine Partition) abfragen müssen, die Sie ausführen müssen, gibt es wahrscheinlich Möglichkeiten, wie Sie Ihre Tabelle so modellieren können, dass sie diese unterstützt.

+0

Danke Aaron .. :) – Mohanish

Verwandte Themen