如何获取Cassandra表中的行数

eva*_*anv 39 cassandra datastax cassandra-2.0

这是一个超级基本的问题,但它实际上已经困扰了我好几天.有没有一种好方法可以获得COUNT(*)Cassandra中给定表的等价?

我将把数亿行转移到C*进行一些负载测试,我想在通过网络移动大量数据之前至少获得一些ETL作业的行计数.

我最好的想法是基本上用Python循环遍历每一行并自动递增一个计数器.有没有更好的方法来确定(甚至估计)C*表的行大小?我还在Datastax Ops Center周围寻找,看看我是否可以确定那里的行大小.如果可以,我不知道它是如何可能的.

其他人需要count(*)在C*中获得一张桌子吗?如果是这样,你怎么去做呢?

cat*_*aws 46

是的,你可以使用COUNT(*).这是文档.

使用COUNT(*)的SELECT表达式返回与查询匹配的行数.或者,您可以使用COUNT(1)来获得相同的结果.

计算users表中的行数:

SELECT COUNT(*) FROM users;
Run Code Online (Sandbox Code Playgroud)

  • 轮到你了.我们都变成了白痴.我明天要来了.等不及了. (73认同)
  • 一般来说,尽管技术上支持,但在 Cassandra 中运行聚合查询并不是一个好的做法。此外,如果最终有数百万行,此查询可能会超时。使用下面的一些 nodetool 命令通常是更好的方法。 (5认同)
  • 哇.我是个白痴.我怎么在文档中错过了? (3认同)
  • 就基准而言,我现在正在运行一个带有SSD和32 GB内存的5节点集群.对于一百万行,它需要大约一分半钟来返回该计数*.我做了很多调整和微调.但就现在的情况而言,如果你愿意的话,"直接开箱即用",它肯定有点偏慢. (3认同)
  • 因此,这似乎可以追溯到关系后的口头禅-为您的查询设计。创建一个保留计数器的表,并在添加行时增加计数。然后查询将很快返回。我希望它大约是几毫秒。 (3认同)
  • 我很想知道你的计数需要多长时间。也许你可以回来报告。:) (2认同)
  • 如果我需要经常对我的桌子执行count(*)s,我当然会同意你的看法.这只是一个完整性检查和控制总计."我发了一百万条记录......他们都来了吗?" 之类的事情 (2认同)

小智 12

您可以使用copy来避免Cassandra超时通常在count(*)上发生

cqlsh -e "copy keyspace.table_name (first_partition_key_name) to '/dev/null'" | sed -n 5p | sed 's/ .*//'

  • @shubham 你能解释一下代码吗?这段代码在做什么。有没有副作用? (5认同)

pha*_*act 10

nodetool cfhistograms如果您不需要精确计数,您也可以得到一些估计值(这些值是估计值).

如果您正在运行DSE,也可以使用spark.


Luc*_*orr 7

nodetool tablestats 快速获取行估计值(以及其他表格统计信息)非常方便。

nodetool tablestats <keyspace.table> 用于特定表

  • 我没有看到使用 tablestats 的估计计数,COPY 似乎是一个不错的选择,但对于较大的表(磁盘上剩余的可用存储空间较少),管理空间有点困难。还有其他办法吗? (2认同)
  • 我在“nodetool tablestats”下没有看到行估计 (2认同)

小智 6

$nodetool settimeout read 360000
cqlsh -e "SELECT COUNT(*) FROM table;" --request-timeout=3600
Run Code Online (Sandbox Code Playgroud)

  • 虽然此代码可能会回答问题,但提供有关如何和/或为什么解决问题的附加上下文将提高​​答案的长期价值。 (8认同)

Pri*_*hah 6

您可以dsbulk count用于检索表的总数。我在读取超时的所有上述命令中挣扎,最后能够使用以下命令获得计数

例如,

dsbulk count -k <keyspace_name> -t <table_name>

可以在此处找到有关 dsbulk 的更多信息