也许这是一个愚蠢的问题,但我不能确定Cassandra中表的大小。
这就是我所尝试的:select count(*) from articles;
如果表很小,它工作得很好,但一旦它填满了,我总是遇到超时问题:
cqlsh:
- 操作超时:错误={},last_host=127.0.0.1
DBeaver:
- 运行1:225,000(7477 ms)
- 运行2:233,637(8265 ms)
- 运行3:216,595(7269 ms)
我假设它遇到了一些超时,只是中止。表中条目的实际数量可能要高得多。
我正在测试一个完全空闲的本地Cassandra示例。我不介意它必须做一个完整的表扫描,并在这段时间内没有React。
是否有一种方法可以可靠地计算Cassandra表中的条目数量?
我用的是Cassandra 2.1.13
7条答案
按热度按时间zengzsys1#
以下是我目前的解决方案:
背景:Cassandra支持export a table to a text file,例如:
这也与生成的文件中的行数相匹配:
mfpqipee2#
据我所知,你的问题与cqlsh的超时有关:操作超时:错误={},last_host=127.0.0.1
你可以简单地增加它的选项:
2ledvvac3#
有没有一种方法可以可靠地计算Cassandra表中的条目数量?
简单的回答是不。这不是一个Cassandra限制,而是分布式系统可靠地计数唯一项的一个艰巨挑战。
这就是近似算法(如HyperLogLog)所面临的挑战。
一个可能的解决方案是在Cassandra中使用counter来计算不同行的数量,但即使是counters在某些情况下也会错误计数,因此您会得到几个%的错误。
vom3gejh4#
这是一个很好的计数行的实用程序,可以避免在Cassandra中运行大型
COUNT(*)
时发生的超时问题:https://github.com/brianmhess/cassandra-count
s4n0splo5#
原因很简单:
当您使用时:
它对数据库的影响与以下相同:
你必须查询你所有的节点。Cassandra只是进入了暂停。
您可以更改超时,但这不是一个好的解决方案。(有一次它很好,但不要在常规查询中使用它。
有一个更好的解决方案:让你的客户数你的行您可以创建一个Java应用程序,在插入行时对行进行计数,并使用Cassandra表中的计数器列插入结果。
bwleehnv6#
你可以使用copy来避免cassandra超时通常发生在count(*)上
使用此bash
cqlsh -e "copy keyspace.table_name (first_partition_key_name) to '/dev/null'" | sed -n 5p | sed 's/ .*//'
g0czyy6m7#
您可以在使用Datastaxcqlsh时将超时秒数定义为命令行选项。默认值为10。