我是这个具体的用例。我将计数器存储在与时间戳相关联的表中:
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"
我如何实现此功能?
答案 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
的唯一方法是提供要删除的特定密钥。对于计数器表,看起来这可能是唯一可行的方法。