如何获取Cassandra表中的行数

时间:2014-10-28 23:13:55

标签: cassandra cassandra-2.0 datastax

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

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

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

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

11 个答案:

答案 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中所有表的详细信息