如何在 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));

时出现超时错误

您可以修改您的数据库查询吗?如果是这样,您可以将查询修改为 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 那里收集到的信息。还需要检查的东西,我能想到的:

  1. 条件应该检查​​ isExhausted() 还是 isFullyFetched()
  2. 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;