从 Cassandra 中的表获取行数的最佳方法是什么?

问题描述 投票:0回答:5

有没有最好的方法可以从 Cassandra 表中获取总行数?

问候, 玛尼

cassandra
5个回答
3
投票
  • DatastaxBulk 可能是最容易安装和运行的。

  • Apache Spark Cassandra 连接器 可能会很方便。一旦数据框加载

    sc.cassandraTable()
    ,你就可以计数

  • 避免在代码中计数,它在执行集群的完整扫描时不会扩展,响应时间将以秒为单位。

  • 避免使用 CQL 进行计数

    select count(*)
    ,因为您可能很快就会超时。


1
投票

背景

Cassandra 有一个内置的 CQL 函数

COUNT()
,它计算查询返回的行数。如果您执行无界查询(无过滤器或
WHERE
子句),它将检索表中您可以计数的所有分区,例如:

SELECT COUNT(*) FROM table_name;

陷阱

但是,不建议这样做,因为它需要全表扫描,查询每个节点,这是非常昂贵的,并且会影响集群的性能。

它可能适用于具有非常小的数据集(例如,几千个分区)的非常小的集群(例如,1 到 3 个节点),但实际上它可能会超时并且不返回结果。我已经在 Why

COUNT()
is bad in Cassandra 中详细解释了为什么你不应该这样做。

推荐解决方案

有多种技术可用于对数据库中的记录进行计数,但最简单的方法是使用 DataStax Bulk Loader (DSBulk)。它是开源的,因此可以免费使用。它最初设计用于将数据批量加载到 Cassandra 集群并从 Cassandra 集群导出数据,作为 cqlsh

COPY
命令的可扩展解决方案。

DSBulk 有一个

count
命令,它提供与 CQL
COUNT()
函数相同的功能,但具有将表扫描分解为小范围查询的优化,因此不会遇到与暴力计数相同的问题。

DSBulk 使用起来非常简单,只需几分钟即可完成设置。首先,您需要从 DataStax Downloads 下载二进制文件,然后解压 tarball。有关详细信息,请参阅DSBulk 安装说明

安装完成后,您可以使用一个命令来计算表中的分区:

$ cd path/to/dsbulk_installation
$ bin/dsbulk count -h <node_ip> -k ks_name -t table_name

以下是一些带有示例的参考资料,可帮助您快速入门:


0
投票

您可以简单地使用 Count(*) 从表中获取行号。

例如,

语法:

SELECT Count(*) 
FROM tablename;

预期的输出如下所示,

 count
-------
     4

(1 rows)

0
投票

您还可以使用 cqlsh 作为小表的替代品。

请参阅此文档 https://www.datastax.com/blog/running-count-expense-cassandra


0
投票

值得一提的是,如果行数很大,则在生产部署中不鼓励检索准确的计数,因为它需要进行全面扫描,并且响应时间和性能影响不可预测。 即使是 DatastaxBulk 也可能很容易花费几个小时,并且随着表中的行数而增长。

如果您需要的只是行数的估计,您还有更多选择:

  1. 如果行的平均大小是可预测的,您可以获取表使用的空间大小(使用nodetoollush&&nodetoolcfstats。或点击wgethttp://localhost:10000/column_family/metrics/live_disk_space_used)
  2. 通过 JMX MBean org.apache.cassandra.metrics:keyspace=uzzstore,name=EstimatedRowCount,scope=chunks,type=ColumnFamily 直接从 cassandra 检索估计大小

请注意,这些值是估计值,由 Cassandra 定期更新,无需我们的控制。

© www.soinside.com 2019 - 2024. All rights reserved.