【问题标题】:How to get next resultset in Cassandra DB如何在 Cassandra DB 中获取下一个结果集
【发布时间】:2022-01-04 10:10:14
【问题描述】:

表包含超过 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

【问题讨论】:

    标签: java cassandra datastax cql datastax-java-driver


    【解决方案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 中收集到的。仍然需要检查的事情,我能想到的:

    1. 条件应该检查​​isExhausted()还是isFullyFetched()
    2. getAvailableWithoutFetching() 是返回当前页面中的结果数,还是目前获取的结果总数?我假设是前者,但如果是后者,那么 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;
    

    【讨论】:

    • 我的 java veriosn 4.6 不支持 fetchMoreResults 和 isExhausted
    • @Gvtha 我已经更新了我的答案,加入了我认为对你有用的另一个解决方案。
    • while 循环无限期地运行,因为循环内没有更新 pagingState。当 pagingState 变为 null 时
    • 你是对的。我又更新了一次。
    猜你喜欢
    • 2012-03-24
    • 1970-01-01
    • 2011-07-28
    • 2017-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-26
    • 1970-01-01
    相关资源
    最近更新 更多