Cassandra 从大型数据集读取

Cassandra read from large dataset

我需要从 Cassandra 中的一个非常大的数据集中得到一个计数,超过 1 亿。我担心如果我只是 运行 以下查询,cassandra 会占用内存。

select count(*) 来自 conv_org 其中 org_id = 'TEST_ORG'

有人告诉我可以使用 cassandra Automatic Paging 来做到这一点?这看起来是个不错的选择吗?

语法会像这样吗?

Statement stmt = new SimpleStatement("select count(*) from conv_org where org_id = 'TEST_ORG'");
stmt.setFetchSize(1000);
ResultSet rs = session.execute(stmt);

我不确定上面的代码是否有效,因为我不需要返回结果集,我只需要一个计数。

这是数据模型。

CREATE TABLE ts.conv_org (
   org_id text,
   create_time timestamp,
   test_id text,
   org_type int,
   PRIMARY KEY (org_id, create_time, conv_id)
)

如果 org_id 不是您在 cassandra 中的主键计数,一般来说这不是一个快速的操作,并且很容易导致对集群中所有 sstables 的全面扫描,因此速度非常慢。

例如,在 Java 中,您可以这样做:

   ResultSet rs = session.execute(...);
   Iterator<Row> iter = rs.iterator();
   while (iter.hasNext()) {
       if (rs.getAvailableWithoutFetching() == 100 && !rs.isFullyFetched())
           rs.fetchMoreResults();
       Row row = iter.next()
       ... process the row ...
   }

https://docs.datastax.com/en/drivers/java/2.0/com/datastax/driver/core/ResultSet.html

您可以 select 一个小列并计算您自己。有 int getAvailableWithoutFetching()isFullyFetched() 可以帮助你。

一般来说,如果您确实需要计数 - 请自行维护。

另一方面,如果一个分区中确实有很多行,您可能还会遇到其他一些性能问题。

但是如果不了解数据模型就很难说了。

也许您想在数据集之外使用 "counter table"。

优点:反击速度快。

缺点:需要保持 table。

参考: https://docs.datastax.com/en/cql/3.3/cql/cql_using/useCountersConcept.html