我需要找出Cassandra表中的记录数是否大于一定数量,例如10000。
我仍然没有大数据集,但是在大规模的情况下,可能会有数十亿条记录,我将如何有效地实现这一目标?
可能有数十亿条记录,或者只有数千条记录。我只需要知道是否大于或小于1万即可。
以下内容似乎不正确,对于大量记录,我认为它会失败或非常慢。
从数据中选择COUNT(*),其中sourceId = {id}和时间戳< {endDate}和时间戳> {startDate};
我也可以这样做:
SELECT *从数据中,其中sourceId = {id} AND时间戳<{endDate} AND时间戳> {startDate}限制10000;
并在内存中计数
我无法使用新表进行计数,例如,当写入新记录时,增加计数器,则该选项不可接受。
还有其他方法吗?限度选择看上去很愚蠢,但似乎最可行。
sourceId是分区键,时间戳是集群键。
Cassandra版本为3.11.4,如果有任何相关性,我将在Spring工作。
答案 0 :(得分:2)
你可以在分区键中引入bucket_id,所以主键是((sourceId,bucket_id),timestamp)。 Bucketing 用于 cassandra 来约束属于单个分区的数据行,即分区将被拆分为更小的块。要计算所有行,请使用附加时间戳字段为每个分区(source_id、bucket_id)发出异步查询。 Bucket_id 可能来自时间戳,因此可以定义需要访问哪个 bucket_id。
另一种解决方案:
答案 1 :(得分:0)
第一个查询:
SELECT COUNT(*) FROM data WHERE sourceId = {id}
AND timestamp < {endDate} AND timestamp > {startDate};
如果您的表具有以下主键,则应该起作用:(sourceId, timestamp, ...)
-在这种情况下,聚合操作是在单个分区内执行的,因此不会涉及多个节点的碰撞等。如果磁盘速度很慢,并且给定时间范围内的数据过多,则可能会超时。
如果您具有其他表结构,则需要使用Spark之类的东西,它将从Cassandra中读取数据,执行过滤和计数...