提问者:小点点

带极限的卡桑德拉计数


我需要找出Cassandra表中的记录计数是否大于一定的数字,例如10000。

我仍然没有大的数据集,但在大规模下,可能有数十亿条记录,我如何能够有效地实现这一点?

可能有几十亿张唱片,或者只有几千张。我只需要知道是多还是少10K。

这下面似乎是不对的,我认为它将失败或非常缓慢的大量记录。

从sourceId={id}和timestamp<{endDate}和timestamp>{startDate}的数据中选择COUNT(*);

我也可以这样做:

还有别的办法吗?带限制的选择看起来很蠢,但似乎是最可行的。

sourceId是分区键,timestamp是集群键。

Cassandra版本是3.11.4,我在Spring工作,如果它有任何相关性的话。


共1个答案

匿名用户

您可以在分区键中引入bucket_id,因此主键将是((sourceId,bucket_id),timestamp)。Bucketing使用cassandra来约束属于单个分区的数据行,即分区将被分割成更小的块。要计数所有行,对每个分区(source_id、bucket_id)发出带有附加时间戳字段的异步查询。Bucket_id可以从时间戳派生出来,这样就可以定义需要访问哪个Bucket_id。

另一种解决方案:

  • 使用Cassandra的计数器(但我读到它会影响性能,并且不能正确处理重复查询和推测查询)
  • 使用另一个db,比如redis,它有原子计数器(但是如何同步redis和Cassandra?)
  • 在写入过程中预先计算值并保存它(例如,写入静态列)
  • 其他东西