在 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、sessionid
和 session_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_time
和 updated_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 transactions 和 if 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]
在这种情况下,如果应用了插入,则值为 true
或 false
。如果返回 false
,那么您可以简单地 运行 一个仅更新 updated_time
:
的更新查询
UPDATE ssession set updated_time = '2015-07-31 10:43:14+0531' where sessionid = '22_865624098';
请注意,轻量级事务会引入一些性能成本,这在我上面链接的文章中有详细说明。它使用 'SERIAL' 一致性级别,这是一个多阶段 QUORUM。这也是一个 'read-then-write' 模式,不会像盲目写入数据那样快。您应该测试此解决方案的性能,看看它是否适合您。
我在 Cassandra 中有以下 table 结构:
CREATE TABLE ssession (
sessionid text PRIMARY KEY,
session_start_time timestamp,
updated_time timestamp
);
session_start_time
是特定会话激活的时间,update_time
是用户执行某些操作之前的时间 activity.Here、sessionid
和 session_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_time
和 updated_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 transactions 和 if 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]
在这种情况下,如果应用了插入,则值为 true
或 false
。如果返回 false
,那么您可以简单地 运行 一个仅更新 updated_time
:
UPDATE ssession set updated_time = '2015-07-31 10:43:14+0531' where sessionid = '22_865624098';
请注意,轻量级事务会引入一些性能成本,这在我上面链接的文章中有详细说明。它使用 'SERIAL' 一致性级别,这是一个多阶段 QUORUM。这也是一个 'read-then-write' 模式,不会像盲目写入数据那样快。您应该测试此解决方案的性能,看看它是否适合您。