我需要从卡桑德拉的一个非常大的数据集中获得一个计数,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)
)
答案 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