Cassandra,计数器和按字段删除

时间:2015-01-23 02:05:58

标签: 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"

我如何实现此功能?

1 个答案:

答案 0 :(得分:3)

要使删除生效,您需要使用equals运算符提供精确键。使用大于/小于运算符删除不起作用。基本上,您必须获取要删除的时间戳列表,并使用(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的唯一方法是提供要删除的特定密钥。对于计数器表,看起来这可能是唯一可行的方法。