【问题标题】:Updating Table In Cassandra在 Cassandra 中更新表
【发布时间】:2015-10-22 16:50:35
【问题描述】:

我在 Cassandra 中有以下表格结构:

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

session_start_time 是特定会话激活的时间,update_time 是用户进行某些活动的时间。在这里,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

而且我需要一个查询来执行此操作。因为,我将不断获取数据(使用风暴来处理数据)。

有什么办法可以做到吗?

【问题讨论】:

    标签: cassandra cql cql3 cqlsh


    【解决方案1】:

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

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

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

    您可以利用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 在这种情况下返回一列 [applied],如果应用了插入,则其值为 truefalse。如果返回了false,那么您可以简单地运行一个只更新updated_time 的更新查询:

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

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

    【讨论】:

    • 或者,您可以在本地缓存您已插入的会话,并且仅在之前未插入时提供 session_start_time。如果它不在缓存中,您可以从 cassandra 中查找它并响应记录是否存在。
    • 谢谢哥们。我正在考虑做这样的事情。 if UPDATE ssession set updated_time = '2015-07-31 10:43:14+0531' where sessionid = '22_865624098' IF sessionid = ‘some-value’; else 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';可以吗?
    • 这不适用于PRIMARY KEY column 'sessionid' cannot have IF conditions
    • 您使用的是哪个版本的 cassandra?我提供的查询在本地使用 C* 2.1.8 对我有效
    • 我使用的是 Cassandra 2.1.5。
    猜你喜欢
    • 2017-12-31
    • 2016-03-25
    • 2016-08-09
    • 2019-10-27
    • 1970-01-01
    • 2015-10-28
    • 2015-11-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多