【问题标题】:Cassandra setFetchSize and number of rows returnedCassandra setFetchSize 和返回的行数
【发布时间】:2018-03-15 22:43:20
【问题描述】:

我编写了以下程序来查询 cassandra 中名为 Foo 的表中的行。该表有 431 行。

val session = getDevTestSession()
val stmt = session.prepare("select * from foo where token(id) > ? and token(id) <= ?")
val ps = stmt.bind(new Long(Long.MIN_VALUE), new Long(Long.MAX_VALUE))
   .setFetchSize(1000)
   .setConsistencyLevel(ConsistencyLevel.ONE)
val resultSet = session.execute(ps)
val iterator = resultSet.iterator()
var rowCount = 0
var expireCount = 0
while(!resultSet.isFullyFetched) {
   resultSet.fetchMoreResults()
   val row = iterator.next()
   if (row != null) {
      rowCount += 1
   }
}
println(s"total number of rows ${rowCount}")
session.close()

此程序返回 0 行。

我改变了程序并设置了

.setFetchSize(1)

现在程序返回了所有 431 行。

我把程序改成

.setFetchSize(100)

现在程序只返回了 400 行。

我想要的是,如果提取大小为 100,但剩余行数仅为 31,那么程序应该返回 31 行而不返回空结果。似乎如果行数小于 fetchSize 则它返回为空而不是返回可用的任何内容。

我的 cassandra 司机是

"com.datastax.cassandra" % "cassandra-driver-core" % "3.1.4"

【问题讨论】:

  • 显示的代码没有使用 JDBC

标签: scala cassandra


【解决方案1】:

!isFullyFetched() 从不保证结果集没有耗尽(您应该调用 isExhausted() 来验证它)。

用尽()

返回此 ResultSet 是否有更多结果。

来源:https://docs.datastax.com/en/drivers/java/2.0/com/datastax/driver/core/ResultSet.html

【讨论】:

    【解决方案2】:

    可以通过以下方式计算行数:

      val cql = "select id from tableStudent"
    
      val resultSet = cassandraSession.execute(cql)
    
      val rowCount = resultSet.getAvailableWithoutFetching
    

    “getAvailableWithoutFetching会给出cql执行返回的行数”

    【讨论】:

    • getAvailableWithoutFetching() 可以从此结果集中检索而不阻塞获取的行数。
    • getAvailableWithoutFetching() 将为您提供提取到内存中的行数,而不是总行数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-19
    • 2014-08-01
    • 2016-06-04
    • 1970-01-01
    • 1970-01-01
    • 2014-11-15
    相关资源
    最近更新 更多