Cassandra CQL3 条件插入/更新

标签 cassandra conditional updates cql3 nosql

我有一个无序事件列表,我的任务是为它们存储第一次和最后一次出现。

我在 Cassandra 中有以下专栏:

CREATE TABLE events (
   event_name TEXT,
   first_occurrence BIGINT,
   last_occurrence BIGINT,
   PRIMARY KEY (event_name)
);

因此,如果我有一个名为“some_event”的事件并且发生在 123456,那么我想要做的是在 MySQL 中看起来像这样的事情:
INSERT INTO events (event_name, first_occurence, last_occurence)
VALUES ('some_event', 123456, 123456)
ON DUPLICATE KEY UPDATE 
     first_occurrence = LEAST(first_occurrence, 12345), 
     last_occurrence = GREATEST(last_occurrence, 123456)

我打算在 Cassandra 中使用轻量级事务来完成它,如下所示:
INSERT INTO events(event_name, first_occurrence, last_occurrence) VALUES ('some_event', 12345, 12345) IF NOT EXISTS;
UPDATE events SET first_occurrence = 123456 WHERE event_name='some_event' IF first_occurrence > 123456;
UPDATE events SET last_occurrence = 123456 WHERE event_name='some_event' IF last_occurrence < 123456;

但事实证明,CQL3 不允许在轻量级事务 IF 子句中使用 < 和 > 运算符。

所以我的问题是,进行这种条件更新的模式是什么?

最佳答案

您正在运行什么版本的 cassandra?在 2.1.1 中通过 CASSANDRA-6839 添加了对 LWT 不等条件的支持:

cqlsh:test> UPDATE events SET first_occurrence = 123456 WHERE event_name='some_event' IF first_occurrence > 1;

[applied]
-----------
  True

关于Cassandra CQL3 条件插入/更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28779465/

相关文章:

java - Cassandra LongType 列名转字符串问题

java - 分别运行Lagom Service Locator/Kafka/Cas​​sandra

mysql - 两个外键字段,恰好一个被设置为一个值,另一个在MySQL数据库的django模型中为null

javascript - JS(template Literal-)生成html,更新DOM?

docker在创建cassandra集群时撰写问题

postgresql - 用于大数据导入和快速查找的 SQL 或 noSQL 数据库?

excel - 条件格式 Google 电子表格

conditional - Gcov 报告普通函数调用的分支

arrays - 如何使用 PostgreSQL 更新 JSON 数组

visual-studio - Visual Studio 2017(专业版)离线更新布局缺少包