我有这个特定的用例。我将计数器存储在与时间戳关联的表中:
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/