Cassandra Python驱动程序无法对大型查询进行分页

qvtsj1bj  于 2022-11-05  发布在  Cassandra
关注(0)|答案(1)|浏览(244)

documentation中,cassandra-driver会在查询足够大时(default_fetch_size为5000行)自动分页,并返回PagedResult
我已经测试过从本地Cassandra阅读数据,它包含9999行SimpleStatement和我自己的读取大小,但它返回的是ResultSet(9999行)而不是pages(PagedResult的示例)。此外,我尝试更改Session.default_fetch_size,但它没有工作。
这是我的代码。

**我的第一次尝试:**这是我用来更改提取大小的SimpleStatement代码。

cluster = Cluster()
session = cluster.connect(keyspace_name)

query = "SELECT * FROM user"
statement = SimpleStatement(query, fetch_size=10)
rows = list(session.execute(statement))
print(len(rows))

它打印9999(所有行),而不是10行,因为我已经设置了fetch_size

**我的第二次尝试:**我尝试通过更改会话的默认提取大小Session.default_fetch_size来更改查询提取大小。

cluster = Cluster()
session = cluster.connect(keyspace_name)
session.default_fetch_size = 10

query = "SELECT * FROM user"
rows = list(session.execute(query))
print(len(rows))

它还打印9999行,而不是10行。
我的目标不是限制提取查询(如SELECT * FROM user LIMIT 10)中的行,而是逐页提取行,以避免内存过载。
那么到底发生了什么呢?
注意:我使用的是Python的Cassandra-Driver 3.25和Python 3.7
如果我的补充信息仍然不能使我的问题成为一个好问题,我很抱歉。我以前从来没有问过任何问题。所以......欢迎提出任何建议:)

9lowa7mx

9lowa7mx1#

您的测试无效,因为您的代码有错误。
当你使用list()时,你实际上是在“具体化”所有的结果页面,你的代码不是在遍历行,而是检索所有的行。
驱动程序会在后台自动提取下一页,直到没有更多的页可供提取。看起来可能不是这样,但实际上每页只包含fetch_size行。
检索下一页的过程是透明的,所以对你来说,结果似乎根本没有被分页,但驱动程序的自动行为正按设计的那样工作。干杯!

相关问题