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
我需要从 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