database - Cassandra,计数器和按字段删除

标签 database cassandra counter cql

我有这个特定的用例。我将计数器存储在与时间戳关联的表中:

CREATE TABLE IF NOT EXISTS metrics(
  timestamp timestamp,
  value counter,
  PRIMARY KEY ((timestamp))
);

并且我想删除所有时间戳低于特定值的指标,例如:

DELETE FROM metrics WHERE timestamp < '2015-01-22 17:43:55-0800';

但此命令返回以下错误:

code=2200 [Invalid query] message="Invalid operator < for PRIMARY KEY part timestamp"

我怎样才能实现这个功能?

最佳答案

要使删除生效,您需要提供带有等号运算符的精确键。使用大于/小于运算符删除不起作用。基本上,您必须获得要删除的时间戳列表,并使用(Python?)脚本或简短的(Java/C#)程序遍历它们。

一个可能的解决方案(如果您碰巧知道要将数据保留多长时间)是为数据设置一个生存时间 (TTL)。在带有计数器列的表上,您不能将其作为 UPDATE 命令的一部分来执行。唯一的选择是在创建表时设置它:

CREATE TABLE IF NOT EXISTS metrics(
  timestamp timestamp,
  value counter,
  PRIMARY KEY ((timestamp))
) WITH default_time_to_live=259200;

这将在 3 天(259200 秒)后删除放入表中的所有数据。

编辑

事实证明,可能 的解决方案实际上是不可能的。即使 Cassandra 允许您创建一个带有 default_time_to_live 集的计数器表,它也不会强制执行。

回到我原来的段落,执行 DELETE 的唯一方法是提供您要删除的特定键。对于柜台来说,这似乎是唯一可行的方法。

关于database - Cassandra,计数器和按字段删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28101933/

相关文章:

cassandra - 为什么当我添加节点时我的 cassandra 吞吐量没有提高?

php - 如何在 Laravel 集合中添加数字?

java - Firebase Firestore 分布式计数器 - 找不到要序列化的属性

php - 为什么此查询不返回对象?

mongodb - Mongo DB 上有 100 TB 的数据?可能的?

database - 如何为 postgresql 配置 HikariCP?

cassandra - 如何在 DataStax Enterprise 上使用 Stargate 获取数据

sql - 不使用空白单元格覆盖数据的 Access 、更新查询

java - Cassandra 节点经常死于堆空间错误

javascript - JS 数一数当时的数字