如何使用java获得cassandra列族中的总行数?

zfycwa2u  于 2021-06-10  发布在  Cassandra
关注(0)|答案(3)|浏览(493)

我要获取列族中的总行数。我知道使用nodetool cfstats我们可以得到大约行。但是如何使用java客户机获得它。

5tmbdcev

5tmbdcev1#

您可以查询 system.size_estimates 表以获取单个主机上分区预范围的大致大小。从你的集群大小和你的射频,你可以作出一个球公园估计。这真的取决于你想要多准确。对于精确的测量,我建议使用spark,但是如果你真的需要它的运行时轨迹,那么使用一个计数器可能是值得的,你可以通过修改来更新它,以便快速读取。

nr9pn0ug

nr9pn0ug2#

我能够做到这一点的唯一方法是编写代码,基本上执行“select*from”,然后一次获取一小行。计数器实际上是由java代码维护的,而不是cassandra。不幸的是,对于cassandra,读取超时很小(一个/local\u为5秒,其他为10秒)。你必须保持你的抓取尺寸小,这样每次抓取都不会超时。如果table很大,可能需要一段时间来完成计数,但确实有效。请记住,在查询运行时,计数可能会发生变化,因此它本身就是一个“估计值”。如果你感兴趣的话,我有一段模块化的java代码。

wz8daaqr

wz8daaqr3#

正如chris所提到的,您可以通过jmx度量获得大致的行数,并且可以通过spark进行更精确的计算。如果您需要通过java客户机执行,那么您将需要执行类似于spark的操作—按令牌范围执行行计数—在这种情况下,您将发出由各个主机执行的查询,而不会像执行naive时那样重载协调器 select * from table . 查询如下所示(这是伪代码,不是真正的查询!) SELECT columns FROM table WHERE token(pk) > token_range.begin AND token(pk) <= token_range.end . 这里应该做的技巧是,您需要显式地设置路由密钥,因为令牌感知负载平衡策略无法自动从该查询中提取路由密钥。
完整的源代码很长,但你可以在这里找到它。

相关问题