这是一个超级基本的问题,但它实际上一直困扰着我好几天。有没有一种好方法可以获得Cassandra中给定表的COUNT(*)
等价物?
我将把数亿行转移到C *中进行一些负载测试,我想在通过网络移动大量数据之前至少获取一些样本ETL作业的行数。
我最好的想法是基本上用Python循环遍历每一行并自动递增一个计数器。有没有更好的方法来确定(甚至估计)C *表的行大小?我还在Datastax Ops Center周围探查,看看我是否可以确定那里的行大小。如果可以,我不知道它是如何可能的。
其他人需要在C *中获得count(*)
表格吗?如果是这样,你怎么去做呢?
答案 0 :(得分:44)
是的,您可以使用COUNT(*)
。这是documentation。
使用COUNT(*)的SELECT表达式返回与查询匹配的行数。或者,您可以使用COUNT(1)来获得相同的结果。
计算users表中的行数:
SELECT COUNT(*) FROM users;
答案 1 :(得分:9)
如果您不需要精确计数(这些值是估算值),您也可以从nodetool cfhistograms
获得一些估算值。
如果您正在运行DSE,也可以使用spark。
答案 2 :(得分:6)
您可以使用复制来避免Cassandra超时通常在count(*)上发生
cqlsh -e "copy keyspace.table_name (first_partition_key_name) to '/dev/null'" | sed -n 5p | sed 's/ .*//'
答案 3 :(得分:5)
nodetool tablestats <keyspace.table>
可以非常方便快速获取行估算值(以及其他表统计信息)。
{{1}}
答案 4 :(得分:3)
我一直在使用Elasticsearch,这可以解决这个问题。假设您愿意使用Elassandra而不是Cassandra。
搜索系统维护许多统计信息,并且在最近一次更新的几秒钟内,它应该对一个表中有多少行有一个很好的了解。
这是一个Match All Query请求,为您提供了以下信息:
Deployment failed. Correlation ID: 19355715-ab4b-4eec-bec7-474c43f02f87. {
"Code": "BadRequest",
"Message": "The parameter sku has an invalid value.",
"Target": null,
"Details": [
{
"Message": "The parameter sku has an invalid value."
},
{
"Code": "BadRequest"
},
{
"ErrorEntity": {
"ExtendedCode": "51008",
"MessageTemplate": "The parameter {0} has an invalid value.",
"Parameters": [
"sku"
],
"Code": "BadRequest",
"Message": "The parameter sku has an invalid value."
}
}
],
"Innererror": null
}
curl -XGET \
-H 'Content-Type: application/json' \
"http://127.0.0.1:9200/<search-keyspace>/_search/?pretty=true"
-d '{ "size": 1, "query": { "match_all": {} } }'
是Elassandra创建的键空间。它通常被命名为类似<search-keyspace>
的名称,因此,如果您有一个名为<keyspace>_<table>
的键空间和一个位于该键空间中的名为foo
的表,则URL将使用bar
。如果要获取所有表中的总行数,则只需使用.../foo_bar/...
。
输出是一个如下所示的JSON:
/_search/
就速度而言,无论行数是多少,这都会花费毫秒。我有成千上万行的表,它的工作就像一个魅力。无需等待数小时或类似时间。
正如其他人所提到的,Elassandra仍然是许多计算机并行使用的系统。如果您始终有许多更新,则计数器将快速更改。因此,只有当您阻止进一步的更新足够长的时间以使计数器稳定下来时,您从Elasticsearch获得的数字才是正确的。否则,它将始终是一个近似结果。
答案 5 :(得分:2)
$nodetool settimeout read 360000
cqlsh -e "SELECT COUNT(*) FROM table;" --request-timeout=3600
答案 6 :(得分:2)
您可以使用dsbulk count
来检索表的总数。我为上面提到的所有具有读取超时的命令而苦苦挣扎,最终能够使用以下命令获取计数
例如,
dsbulk count -k <keyspace_name> -t <table_name>
有关dsbulk的更多信息,请参见here
答案 7 :(得分:0)
对于使用C#Linq组件适配器的用户,可以使用:
var t = new Table<T>(session);
var count = t.Count().Execute();
答案 8 :(得分:0)
对于count(*)
大表,您可以在 Cassandra 顶部使用Presto。我已经测试过,并且效果很好。
请参考以下URL: 关键字搜索:Cassandra问题v3.11.3…
select count(*) from table1
URL:Cassandra question v3.11.3 ... select count(*) from table1
答案 9 :(得分:0)
考虑对列约束使用ALLOW FILTERING,然后求和。
例如:
SELECT count(*)
FROM my_table
WHERE datetime_id >= '2020-09-16' ALLOW FILTERING;
SELECT count(*)
FROM my_table
WHERE datetime_id < '2020-09-16' ALLOW FILTERING;
答案 10 :(得分:-3)
nodetool cfstats | grep -1000键空间
替换KEYSPACE,以获取该KEYSPACE中所有表的详细信息