如何删除cassandra中最早的记录?

时间:2017-05-05 20:28:04

标签: cassandra

例如:在一天中,我在表格中加载了10条记录,我希望表格中有前三条最新记录,其他每条记录都应删除

1 个答案:

答案 0 :(得分:1)

为什么不设计它像

CREATE IF NOT EXISTS keyspace_name.table_name (
  key text,
  year_month_day text,
  time timeuuid,
  record blob,
  PRIMARY KEY ((key, year_month_day), time)  
) WITH CLUSTERING ORDER BY (time DESC);

在一天结束时

SELECT * FROM keyspace_name.table_name LIMIT 3;`

然后删除其余的

DELETE FROM keyspace_name.table_name WHERE key = 'something' AND year_month_day = '2017-05-05' AND time > lasttimefromselect`

或者如果您更愿意在插页上工作而不需要找回工作并清理它...请记住这是慢的但如果只做10就不会任何争论。你可以只有一个正在运行的计数器并将其调整为3,以便在它超过3时写入最旧的计数器。然后就不会有必要的删除。

CREATE IF NOT EXISTS keyspace_name.table_name (
  key text,
  ymd text,
  offset int STATIC,
  bucket int, 
  record blob,
  PRIMARY KEY ((key, ymd), bucket)  
) WITH COMPACTION = { 'class' :  'LeveledCompactionStrategy'  };

然后执行读取和CAS更新

SELECT * FROM  keyspace_name.table_name WHERE key='key' AND ymd='yyyy-mm-dd';

BEGIN BATCH
  UPDATE table_name SET offset = [retrieved_offset+1] WHERE key = key AND ymd = 'yyyy-mm-dd' IF offset = [retrieved_offset];
  UPDATE table_name SET bucket=[retrieved_offset%3], record=[...] WHERE key = key AND ymd = 'yyyy-mm-dd';
APPLY BATCH;

然后将其置于循环中,直到applied为真。