Select Cassandra和使用计数器类型清理旧数据

Select Cassandra和使用计数器类型清理旧数据,select,cassandra,counter,ttl,Select,Cassandra,Counter,Ttl,因此,我知道,由于设计原因,TTL不适用于计数器,我已经阅读了关于这一点的其他一些So问题,但似乎没有明确的答案(除非我遗漏了一些完全合理的东西): 我们如何优雅地处理卡桑德拉的计数器过期问题 示例用例:特定日期的页面视图 为此,我们可能会有一个表,如 创建表pageviews(page varchar,date varchar,views counter,主键(page,date)) 一年后的某一天,我们拥有多少视图的信息不是很相关(相反,我们可能会将其聚合到视图/月份表或类似的表中),我们不

因此,我知道,由于设计原因,TTL不适用于计数器,我已经阅读了关于这一点的其他一些So问题,但似乎没有明确的答案(除非我遗漏了一些完全合理的东西):

我们如何优雅地处理卡桑德拉的计数器过期问题

示例用例:特定日期的页面视图

为此,我们可能会有一个表,如

创建表pageviews(page varchar,date varchar,views counter,主键(page,date))

一年后的某一天,我们拥有多少视图的信息不是很相关(相反,我们可能会将其聚合到视图/月份表或类似的表中),我们不希望不必要的数据无缘无故地挂在数据库中。通常我们会在上面放一个TTL,让卡桑德拉为我们处理-优雅!但由于我们不允许对计数器表使用TTL,因此这不是一个选项

您也不能仅从页面视图中运行delete from date>'xxxx',因为这两个键都必须在where子句中定义。 您首先需要查询所有页面,然后执行单独的删除,这是不可伸缩的。 有没有合适的方法来实现这一点呢?

它的速度要慢得多,但如果你不想自己管理到期时间,这就是价格——你可以使用LWTs并实际插入TTL列,而不是更新计数器。即:

CREATE TABLE pageviews (
  page varchar,
  date timestamp,
  views int,
  PRIMARY KEY(page, date))
WITH compaction = {'class': 'LeveledCompactionStrategy'};
要更新页面视图,请执行以下操作:

UPDATE pageviews USING TTL 604800
   SET views = *12*
   WHERE page = '/home' AND date = YYYY-MM-DD
   IF views = *11*
如果失败,请重新阅读并重试。如果争用率很高,这可能会非常慢,但在这种情况下,您可以对每个应用程序执行一些批处理,比如说每10秒或其他时间只刷新更新一次,并且一次递增1次以上

要查看日期范围内的总计,请执行以下操作:

SELECT sum(views) FROM pageviews WHERE page='/home' and date >= '2017-01-01 00:00:00+0200' AND date <= '2017-01-13 23:59:00+0200'

从pageviews中选择sum(views),其中page='/home'和date>='2017-01-01 00:00:00+0200'和date如果不需要日期范围查询,可以使用分区键
page%X,date
和聚类键
page


然后,对于您希望放弃的每个日期,您可以使用X delete语句删除分区0到X-1。

谢谢您的回答。嗯,我提到的工作清理的问题是,你必须知道页面id,这意味着你必须记住它们。在我的情况下,这可能是巨大的。您不能仅从日期>='xxx'的页面视图中删除。我觉得这是对cassandra的一个硬限制,并且有一个合法的用例,您可能希望使用ttl和计数器行。在运行一些测试之后,主键上的selectdistinct实际上相当快,只是在一段时间内要发出的delete语句的数量将呈指数增长。