如何使用Java获取cassandra列系列中的行总数?

时间:2019-03-18 08:34:36

标签: cassandra cassandra-2.0 hector

我想获取列族中的总行数。我知道使用nodetool cfstats可以获得大约行。但是如何使用Java Client获得它。

3 个答案:

答案 0 :(得分:0)

我能够做到这一点的唯一方法是编写代码,该代码本质上执行“ select * from”,然后一次获取小的行。计数器实际上是由Java代码而不是cassandra维护的。不幸的是,对于cassandra,读取超时很小(一个/ local_one为5秒,其他为10秒)。您必须减小获取大小,以免每次获取都超时。如果表很大,则可能需要一段时间才能完成计数,但是它确实可以工作。请记住,查询运行时计数可能会发生变化,因此它本身就是一个“估计”。如果您感兴趣的话,我有一段模块化的Java代码。

答案 1 :(得分:0)

您可以查询system.size_estimates表,以获取单个主机上预先设置的分区的大约大小。根据群集的大小和RF,您可以据此做出估算。这实际上取决于您想要的精度。为了进行精确的测量,我建议使用Spark,但是如果确实需要Spark,则值得使用运行时跟踪它,您可以使用随更新而更新的计数器来快速读取。

答案 2 :(得分:0)

正如Chris所述,您可以通过JMX指标获得大约的行数,而Spark可以完成更精确的计算。如果您需要通过Java客户端执行此操作,则需要执行与Spark相似的操作-按令牌范围对行进行计数-在这种情况下,您要发布由单个主机执行的查询,而无需如果您天真地select * from table,则会使协调器超载。查询看起来像这里(是伪代码,不是真实查询!SELECT columns FROM table WHERE token(pk) > token_range.begin AND token(pk) <= token_range.end。此处应采取的技巧是,您需要显式设置路由密钥,因为令牌感知的负载平衡策略无法从该查询中自动提取它。

要在此处包含完整的源代码很长,但是您可以here找到它。