卡桑德拉计数限制

时间:2020-02-19 10:17:18

标签: cassandra

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

我仍然没有大数据集,但是在大规模的情况下,可能会有数十亿条记录,我将如何有效地实现这一目标?

可能有数十亿条记录,或者只有数千条记录。我只需要知道是否大于或小于1万即可。

以下内容似乎不正确,对于大量记录,我认为它会失败或非常慢。

从数据中选择COUNT(*),其中sourceId = {id}和时间戳< {endDate}和时间戳> {startDate};

我也可以这样做:

SELECT *从数据中,其中sourceId = {id} AND时间戳<{endDate} AND时间戳> {startDate}限制10000;

并在内存中计数

我无法使用新表进行计数,例如,当写入新记录时,增加计数器,则该选项不可接受。

还有其他方法吗?限度选择看上去很愚蠢,但似乎最可行。

sourceId是分区键,时间戳是集群键。

Cassandra版本为3.11.4,如果有任何相关性,我将在Spring工作。

2 个答案:

答案 0 :(得分:2)

你可以在分区键中引入bucket_id,所以主键是((sourceId,bucket_id),timestamp)。 Bucketing 用于 cassandra 来约束属于单个分区的数据行,即分区将被拆分为更小的块。要计算所有行,请使用附加时间戳字段为每个分区(source_id、bucket_id)发出异步查询。 Bucket_id 可能来自时间戳,因此可以定义需要访问哪个 bucket_id。

另一种解决方案:

  • 使用 cassandra 的计数器(但我读到它会影响性能,并且无法正确处理重复和推测查询)
  • 使用另一个数据库,例如具有原子计数器的 redis(但如何同步 redis 和 cassandra?)
  • 预先计算值并在写入期间保存(例如到静态列中)
  • 别的东西

答案 1 :(得分:0)

第一个查询:

SELECT COUNT(*) FROM data WHERE sourceId = {id} 
   AND timestamp < {endDate} AND timestamp > {startDate};

如果您的表具有以下主键,则应该起作用:(sourceId, timestamp, ...)-在这种情况下,聚合操作是在单个分区内执行的,因此不会涉及多个节点的碰撞等。如果磁盘速度很慢,并且给定时间范围内的数据过多,则可能会超时。

如果您具有其他表结构,则需要使用Spark之类的东西,它将从Cassandra中读取数据,执行过滤和计数...

相关问题