如何在 Cassandra DB 中获取下一个结果集
How to get next resultset in Cassandra DB
Table 包含超过 100,000 行。我正在尝试获取总行数。我不想使用异步。
Statement statement = session.prepare("SELECT user_id from table");
ResultSet resultSet = session.execute(statement);
int count = resultSet.getAvailableWithoutFetching()
我从上面得到了 5000 行。是否可以迭代并获得接下来的 5000 个结果集直到 100,000 个,这样我就可以对行求和以获得总计数。
使用 session.execute(statement.setPageSize(100000));
时出现超时错误
- DSE - 6.8.9
- Cql - 3.4.5
- 卡桑德拉 - 4.0.0.681
- Java 驱动程序 - 4.6.1
您可以修改您的数据库查询吗?如果是这样,您可以将查询修改为 SELECT COUNT(user_id) FROM table
,然后您只需要查看一行数据。
如果没有,看来你需要使用.fetchMoreResults()
方法来获取下一个结果。我看到你根本不想使用异步。这可以通过调用 .get()
来避免
Statement statement = session.prepare("SELECT user_id from table");
ResultSet resultSet = session.execute(statement);
int count = resultSet.getAvailableWithoutFetching();
while (!resultSet.isExhausted()) {
resultSet = resultSet.fetchMoreResults().get();
count += resultSet.getAvailableWithoutFetching();
}
全面披露;我以前没有使用过 DSE,这正是我可以从他们 docs 那里收集到的信息。还需要检查的东西,我能想到的:
- 条件应该检查
isExhausted()
还是 isFullyFetched()
?
-
getAvailableWithoutFetching()
return 是当前页面中的结果数,还是目前获取的结果总数?我假设是前者,但如果是后者,那么 count
应该只根据最后一个 resultSet
的可用大小设置,而不是为每个页面添加
编辑:我看到你有版本4.6.1,好的。 pagingState()
似乎值得研究。
Statement statement = session.prepare("SELECT user_id from table");
ResultSet resultSet = session.execute(statement);
int count = resultSet.getAvailableWithoutFetching();
ByteBuffer pagingState = resultSet.getExecutionInfo().getPagingState();
while (pagingState != null) {
statement = statement.copy(pagingState);
resultSet = session.execute(statement);
pagingState = resultSet.getExecutionInfo().getPagingState();
count += resultSet.getAvailableWithoutFetching();
}
return count;
Table 包含超过 100,000 行。我正在尝试获取总行数。我不想使用异步。
Statement statement = session.prepare("SELECT user_id from table");
ResultSet resultSet = session.execute(statement);
int count = resultSet.getAvailableWithoutFetching()
我从上面得到了 5000 行。是否可以迭代并获得接下来的 5000 个结果集直到 100,000 个,这样我就可以对行求和以获得总计数。
使用 session.execute(statement.setPageSize(100000));
- DSE - 6.8.9
- Cql - 3.4.5
- 卡桑德拉 - 4.0.0.681
- Java 驱动程序 - 4.6.1
您可以修改您的数据库查询吗?如果是这样,您可以将查询修改为 SELECT COUNT(user_id) FROM table
,然后您只需要查看一行数据。
如果没有,看来你需要使用.fetchMoreResults()
方法来获取下一个结果。我看到你根本不想使用异步。这可以通过调用 .get()
Statement statement = session.prepare("SELECT user_id from table");
ResultSet resultSet = session.execute(statement);
int count = resultSet.getAvailableWithoutFetching();
while (!resultSet.isExhausted()) {
resultSet = resultSet.fetchMoreResults().get();
count += resultSet.getAvailableWithoutFetching();
}
全面披露;我以前没有使用过 DSE,这正是我可以从他们 docs 那里收集到的信息。还需要检查的东西,我能想到的:
- 条件应该检查
isExhausted()
还是isFullyFetched()
? -
getAvailableWithoutFetching()
return 是当前页面中的结果数,还是目前获取的结果总数?我假设是前者,但如果是后者,那么count
应该只根据最后一个resultSet
的可用大小设置,而不是为每个页面添加
编辑:我看到你有版本4.6.1,好的。 pagingState()
似乎值得研究。
Statement statement = session.prepare("SELECT user_id from table");
ResultSet resultSet = session.execute(statement);
int count = resultSet.getAvailableWithoutFetching();
ByteBuffer pagingState = resultSet.getExecutionInfo().getPagingState();
while (pagingState != null) {
statement = statement.copy(pagingState);
resultSet = session.execute(statement);
pagingState = resultSet.getExecutionInfo().getPagingState();
count += resultSet.getAvailableWithoutFetching();
}
return count;