删除时间戳早于给定时间戳的Cassandra表条目

时间:2017-01-12 18:28:52

标签: cassandra cql ttl

我想删除比给定时间戳早的表请求中的所有条目。

表的结构请求:

CREATE TABLE requests (
    request_id uuid,
    request_timestamp timestamp,
    PRIMARY KEY (request_id, request_timestamp)
) WITH CLUSTERING ORDER BY (request_timestamp ASC)

显然,以下查询不起作用,因为必须指定主键request_id:

Delete from Requests where request_timestamp < givenTimestamp;

但是当我有一个包含数百万条目的庞大表格时,使用带有IN子句的查询将不是最佳的:

Delete from Requests where request_id in (id1, id2.....) and request_timestamp < givenTimestamp;

一个选项是使用TTL(生存时间)但我们希望保持条目的TTL可配置,并且使用TTL这是不可能的。

还有哪些方法可以删除表中的旧条目?

谢谢

1 个答案:

答案 0 :(得分:1)

主要的是,正如您已经写过的那样,您需要提供一个分区键来执行此类删除。

假设您希望每天删除时间戳少于特定日期的所有请求,为了提高效率,您可以在#34; day&#34;之前更改模型和分区。而不是request_id。类似的东西:

CREATE TABLE requests (
    day timestamp,
    request_id uuid,
    request_timestamp timestamp,
    PRIMARY KEY (day, request_timestamp, request_id)
) WITH CLUSTERING ORDER BY (request_timestamp ASC, request_id ASC)

字段day仅填充了request_timestamp 截断 day 组件(例如yyyy-mm-dd)。如果您需要从多个期间删除,则需要运行一堆并行的DELETE查询,每天一次,并且不要使用IN。您也可以在分区级别删除,而不是在单元级别删除,这对于读取来说是一个很大的优势。