Cassandra 更新 - 带有时间戳聚类键的“位置”

Posted

技术标签:

【中文标题】Cassandra 更新 - 带有时间戳聚类键的“位置”【英文标题】:Cassandra Update - 'Where' with timestamp clustering key 【发布时间】:2019-01-09 12:16:15 【问题描述】:

我在 cassandra 中有一张表,结构如下:

CREATE TABLE answers (
  Id              uuid,
  Name            text,
  Description     text,
  LastVersion     boolean,
  CreationDate    timestamp,
  EditionDate     timestamp,
  PRIMARY KEY(Id, EditionDate)
)WITH CLUSTERING ORDER BY (EditionDate DESC);

问题是当我需要将LastVersion 列的值更新为false 时。在这种情况下,新行仅插入Primary Key (Id, EditionDate)的值+LastVersion列的值。

按此顺序:

插入:

insert into answers 
(id, name, description, lastversion, creationdate, editiondate)
values
(uuid(), 'Test 1', 'Description 1', true, dateof(now()), dateof(now()));

结果:

 id                                   | editiondate                     | creationdate                    | description   | lastversion | name
--------------------------------------+---------------------------------+---------------------------------+---------------+-------------+--------
 ac4f9ec1-8737-427c-8a63-7bdb62c93932 | 2018-08-01 19:54:51.603000+0000 | 2018-08-01 19:54:51.603000+0000 | Description 1 |        True | Test 1

更新:

update answers 
set lastversion = false 
where id = ac4f9ec1-8737-427c-8a63-7bdb62c93932 
and editiondate = '2018-08-01 19:54:51';

结果:

 id                                   | editiondate                     | creationdate                    | description   | lastversion | name
--------------------------------------+---------------------------------+---------------------------------+---------------+-------------+--------
 ac4f9ec1-8737-427c-8a63-7bdb62c93932 | 2018-08-01 19:54:51.603000+0000 | 2018-08-01 19:54:51.603000+0000 | Description 1 |        True | Test 1
 ac4f9ec1-8737-427c-8a63-7bdb62c93932 | 2018-08-01 19:54:51.000000+0000 |                            null |          null |       False |   null

怎么了?实际上 EditionTime 字段似乎有所不同,但是我在 UPDATE 查询上花费了相同的值。

【问题讨论】:

相关:***.com/questions/28547616/… 【参考方案1】:

您的更新使用的 editionDate 值与您插入的值不同,因此您的更新找不到原始行。 Cassandra 的更新和插入确实是 upsert,因此正在插入带有新键的新行。

请注意,EditionDate 具有毫秒精度,但您的更新仅将其指定为最接近的秒数。

【讨论】:

是的,版本时间需要明确。但是,我需要一种方法来消除整个精度,比如强制“格式”。

以上是关于Cassandra 更新 - 带有时间戳聚类键的“位置”的主要内容,如果未能解决你的问题,请参考以下文章

Cassandra 复合聚类键和排序查询

SQL Server:按时间戳聚类;优点缺点

Spark cassandra 连接器 + 加入超时

聚类键列必须与 CLUSTERING ORDER BY 指令中的列完全匹配

带有分区键的 cassandra getendpoints 有空间

是否可以从分区中的每个聚类键Y中选择X记录?