在 Cassandra 中更新 Table

Updating Table In Cassandra

我在 Cassandra 中有以下 table 结构:

CREATE TABLE ssession (
  sessionid text PRIMARY KEY,
  session_start_time timestamp,
  updated_time timestamp
);

session_start_time 是特定会话激活的时间,update_time 是用户执行某些操作之前的时间 activity.Here、sessionidsession_start_time将被插入一次并且 updated_time 随着用户的活跃而不断更新。

I want to include only sessionid as the primary key.

正常更新语句为:

UPDATE ssession SET session_start_time  = '2015-07-31 10:43:13+0530',
updated_time = '2015-07-31 10:43:13+0530' WHERE sessionid = '22_865624098';

在这里,第一次我将插入相同的 session_start_timeupdated_time。但从下一次开始,我将只需要更新 updated_time

而且我需要一个查询来完成 so.Since,我将持续获取数据(使用 storm 处理数据)。

有什么办法可以实现吗?

当您插入或更新数据时(更新和插入在 cassandra 中是相同的)您不需要提供所有列。如果您只想更新 updated_time,您的查询应该是:

UPDATE ssession SET updated_time = '2015-07-31 10:43:13+0530' WHERE sessionid = '22_865624098';

但听起来您想确保 session_start_time 是在第一次创建 sessionid 时设置的,并且只是第一次,对吗?

您可以利用 lightweight transactionsif not exists 创建具有 session_start_time 的数据。如果已经有包含 session_id 的行,则不会应用插入:

INSERT INTO ssession (sessionid, session_start_time, updated_time) values ('22_865624098', '2015-07-31 10:43:13+0530', '2015-07-31 10:43:13+0530') if not exists;

Cassandra returns 列 [applied] 在这种情况下,如果应用了插入,则值为 truefalse 。如果返回 false,那么您可以简单地 运行 一个仅更新 updated_time:

的更新查询
UPDATE ssession set updated_time = '2015-07-31 10:43:14+0531' where sessionid = '22_865624098';

请注意,轻量级事务会引入一些性能成本,这在我上面链接的文章中有详细说明。它使用 'SERIAL' 一致性级别,这是一个多阶段 QUORUM。这也是一个 'read-then-write' 模式,不会像盲目写入数据那样快。您应该测试此解决方案的性能,看看它是否适合您。