【发布时间】:2017-02-23 08:32:31
【问题描述】:
我正在尝试在 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
所以本质上,我可以为给定的行设置一堆时间戳,为一行设置一个单一的 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,使用 thrift 客户端很容易做到这一点,但使用它不是一个选项 =/
【问题讨论】: