2016-10-14 3 views
0

Ich versuche, einige Zeitreihendaten in Cassandra zu modellieren, die ich mit dem älteren Sparsamkeitsklienten machen konnte, aber CQL scheint mich zu werfen.CAS mit CQL in Cassandra

Ich möchte eine neue Spalte meiner Zeile hinzufügen, wenn ein bestimmter Spaltenwert übereinstimmt.

Meine Tabellendefinition ist:

CREATE TABLE TestTable (
    key int, 
    base uuid, 
    ts int,     // Timestamp (column name) 
    val text,     // Timestamp value (column value) 
    PRIMARY KEY (key, ts) 
) WITH CLUSTERING ORDER BY (ts DESC); 

Was ich vermute, es ist wie aussehen würde:

Row | UUID | TS | TS | TS 
--- | ---- | --- | ---| --- 
1 | id1 | 1 | 2 | 3 
--- | --- | --- | ---| --- 
2 | id2 | 1 | 5 | 6 

im Wesentlichen Also, ich ein paar Zeitstempel für eine bestimmte Zeile haben kann und eine EINZIGE UUID für eine Zeile. Die UUID muss für jede neue Einfügung einer TS-Spalte aktualisiert werden.

fügt also in einer Reihe gut funktionieren:

insert into TestTable(key, base, ts, val) values (1, dfb63886-91a4-11e6-ae22-56b6b6499611, 50, 'one') 

Aber ich versagt, einen Weg, um herauszufinden, mit CQL, eine neue Spalte in einer Reihe Transaktionen mit Cassandra INSERT (CAS).

Dieses versagt:

insert into TestTable(key, base, ts, val) values (1, dfb63886-91a4-11e6-ae22-56b6b6499611, 70, 'four') if base = dfb63886-91a4-11e6-ae22-56b6b6499611; 

mit dem Fehler:

SyntaxException: <ErrorMessage code=2000 [Syntax error in CQL query] message="line 1:106 mismatched input 'base' expecting K_NOT (..., 70, 'four') if [base] =...)"> 

und die Abfrage:

update TestTable set val = 'four', ts=70 where key = 1 if base = dfb63886-91a4-11e6-ae22-56b6b6499611; 

schlägt mit dem Fehler:

InvalidRequest: code=2200 [Invalid query] message="PRIMARY KEY part ts found in SET part" 

Ich versuche herauszufinden, wie man die Daten richtig modelliert, so dass ich nur eine UUID pro Zeile habe und mehrere Spalten haben kann, ohne sie bei der Tabellenerstellung explizit definieren zu müssen, da sie ziemlich variieren kann.

IIRC, war es einfach, dies zu tun mit dem Secondhand-Client aber mit, dass keine Option =/

Antwort

0

Es ein nettes Tutorial ist in Bezug auf Datenreihe here

Auf den Punkt gebracht, Ihre zusammengesetzten Schlüssel wird Ihre eindeutige Kennung (wie die UUID, die Sie vorschlugen) und einen Zeitstempel, so dass Sie so viele Ereignisse/Werte zu einem UUID assoziiert hinzufügen werden in der Lage

CREATE TABLE IF NOT EXISTS TestTable (
    base uuid, 
    ts timestamp,    // Timestamp (column name) 
    value text,     // Timestamp value (column value) 
    PRIMARY KEY (base, ts) 
) WITH CLUSTERING ORDER BY (ts DESC); 

Werte hinzufügen, wird die gleiche UUID mit unterschiedlichen Zeiten haben :

INSERT INTO TestTable (base, ts, value) 
    VALUES (467286c5-7d13-40c2-92d0-73434ee8970c, dateof(now()), 'abc'); 

INSERT INTO TestTable (base, ts, value) 
    VALUES (467286c5-7d13-40c2-92d0-73434ee8970c, dateof(now()), 'def'); 

cqlsh:test> SELECT * FROM TestTable WHERE base = 467286c5-7d13-40c2-92d0-73434ee8970c; 

base         | ts        | value 
--------------------------------------+---------------------------------+------- 
467286c5-7d13-40c2-92d0-73434ee8970c | 2016-10-14 04:13:42.779000+0000 | def 
467286c5-7d13-40c2-92d0-73434ee8970c | 2016-10-14 04:12:50.551000+0000 | abc 

(2 rows) 

Aktualisierung kann in einer der Spalten erfolgen, außer die als Schlüssel verwendet zeigten die Fehler in der Update-Anweisung wurde durch die verursachte „IF“ -Anweisung und weil versucht wurde, ts zu aktualisieren, ist Teil des zusammengesetzten Schlüssels.

INSERT INTO TestTable (base, ts, value) 
     VALUES (ffb0bb8e-3d67-4203-8c53-046a21992e52, dateof(now()), 'bananas'); 

SELECT * FROM TestTable WHERE base = ffb0bb8e-3d67-4203-8c53-046a21992e52 AND ts < dateof(now()); 

base         | ts        | value 
--------------------------------------+---------------------------------+--------- 
ffb0bb8e-3d67-4203-8c53-046a21992e52 | 2016-10-14 04:17:26.421000+0000 | apples 

(1 rows) 

UPDATE TestTable SET value = 'apples' WHERE base = ffb0bb8e-3d67-4203-8c53-046a21992e52; 

SELECT * FROM TestTable WHERE base = ffb0bb8e-3d67-4203-8c53-046a21992e52 AND ts < dateof(now()); 

base         | ts        | value 
--------------------------------------+---------------------------------+--------- 
ffb0bb8e-3d67-4203-8c53-046a21992e52 | 2016-10-14 04:17:26.421000+0000 | bananas 

(1 rows) 
+0

Also gibt es keine Möglichkeit in CQL beliebige Spalten hinzuzufügen und CAS zu verwenden? –

+0

Ja, es ist möglich, dynamische Spalten zu einer Zeile hinzuzufügen, die Erklärung ist [hier] (http: //www.datastax.com/dev/blog/does-cql-support-dynamische-columns-wide-rows) –

+0

Die Art, wie die Tabelle derzeit eingerichtet wird, fügt dynamische Spalten hinzu. –

Verwandte Themen