Cassandra从大型数据集中读取

时间:2018-01-31 20:28:39

标签: cassandra datastax

我需要从卡桑德拉的一个非常大的数据集中获得一个计数,1亿多。我担心如果我只是运行以下查询,cassandra将会占用内存。

从conv_org中选择count(*),其中org_id ='TEST_ORG'

我被告知我可以使用cassandra自动寻呼来做到这一点?这看起来是个不错的选择吗?

语法看起来像这样吗?

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)
)

2 个答案:

答案 0 :(得分:2)

如果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

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

一般情况下,如果你真的需要一个计数 - 自己维护它。

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

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

答案 1 :(得分:0)

也许除了数据集之外,您还想使用“计数器表”。

优点:快速计数器。

缺点:需要维护该表。

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