Cassandra 适用于聚合查询吗?

Is Cassandra suitable for Aggregate Queries?

我了解到列式数据库适用于聚合查询,而 Cassandra 是一个列式数据库。我正在尝试在 Cassandra 中使用计数(针对特定分区的值 'between' 或 '>=')。这是性能密集型吗?

Cassandra is a partitioned row store。数据存储在分区中,聚集在一起并作为“行”使用。它不是列式数据库。

对 运行 计数的聚合查询在 Cassandra 上执行不佳。尝试它 是性能密集型的,直到协调器节点 times-out 查询。

如果这是您需要解决的用例,另一个数据库将是更好的选择。

添加到@aaron 的回复中,如果您在分区内执行 just 聚合操作,那可能没问题。例如,

假设您的 table 架构如下:

CREATE TABLE IF NOT EXISTS keyspace_name.table_name (
 partition_key1 some_type,
 partition_key2 some_type,
 clustering_key1 some_type,
 clustering_key2 some_other_type,
 regular_column1 some_type,
 ...
 regular_columnN some_type,
 PRIMARY KEY ((partition_key1, partition_key2), clustering_key1, clustering_key2)
) WITH CLUSTERING ORDER BY(ck1 DESC, ck2 DESC)
AND ...;

为了提高性能,aggregation 查询可能没问题,

SELECT COUNT(some_regular_column) FROM keyspace_name.table_name WHERE partition_key1 = ? AND partition_key2 = ? AND clustering_key1 >= ? AND clustering_key2 <= ?;

Cassandra 是一个列式数据库,这是一种常见的误解。我认为它来自 tables 的旧术语“列族”。数据存储在包含 key-value 对列的行中,这就是为什么 table 过去被称为列族的原因。

与传统关系数据库相比的一个主要区别是 Cassandra tables 可以是二维的(每条记录只包含一行)或 multi-dimensional(每条记录可以包含一个或多个行).

另一方面,列式数据库翻转二维 table,这样数据存储在列而不是行中,专门针对聚合等 analytics-type 查询进行了优化——这不是卡桑德拉。

回到你的问题,对大多数数据模型来说,计算单个分区内的行是可以的。关键是将查询限制为仅一个分区,如:

    SELECT COUNT(some_column) FROM table_name
        WHERE pk = ?

也可以对范围查询中的行进行计数,只要它们被限制在一个分区内,例如:

    SELECT COUNT(some_column) FROM table_name
        WHERE pk = ?
        AND clustering_col >= ?
        AND clustering_col <= ?

如果您不将查询限制为单个分区,它可能适用于 (a) 非常小的数据集和 (b) 节点数量非常少的集群,但它不会像 (c) 那样扩展数据集增长,并且(d)节点数量增加。我已经在 post -- https://community.datastax.com/questions/6897/.

中解释了为什么在 Cassandra 中执行 COUNT() 之类的聚合是不好的

这并不是说 Cassandra 不适合。如果您的主要用例是为 OLTP 工作负载存储 real-time 数据,Cassandra 是一个不错的选择。对于分析查询,您只需要使用 Apache Spark 等其他软件,因为 spark-cassandra-connector 会优化对 Cassandra 的查询。干杯!