CAS中使用CQL的Cassandra

时间:2016-10-14 02:55:48

标签: cassandra transactions

我试图在Cassandra中建模一些时间序列数据,我可以用较旧的thrift客户端进行建模,但是CQL似乎让我失望了。

如果特定列值匹配,我想在我的行中添加一个新列。

我的表定义是:

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);

我猜测的是:

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

基本上,我可以为给定行提供一堆时间戳,为行提供一个SINGLE UUID。 需要针对TS列的每个新插入更新UUID。

因此,连续插入工作正常:

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

但是我没有找到一种方法,使用CQL,使用Cassandra事务(CAS)连续插入一个新列。

这个失败了:

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

错误:

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

查询:

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

因错误而失败:

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

我试图弄清楚如何正确建模数据,这样我每行只有一个UUID,并且可以有多个列,而不必在创建表时明确定义它们,因为它可能会有很大差异。

IIRC,与节俭客户很容易做到这一点,但使用的不是选项= /

1 个答案:

答案 0 :(得分:0)

关于数据系列here

,有一个很好的教程

简而言之,您的组合键将是您的唯一标识符(如您提议的UUID)和时间戳,因此您将能够添加与UUID相关联的任意数量的事件/值

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);

添加值将具有相同的UUID,具有不同的时间:

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)

更新可以在任何列中进行,除了用作键之外,更新语句中显示的错误是由&#34; IF&#34;声明,因为它试图更新ts,它是复合键的一部分。

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)