在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
如果我的补充信息仍然不能使我的问题成为一个好问题,我很抱歉。我以前从来没有问过任何问题。所以......欢迎提出任何建议:)
1条答案
按热度按时间9lowa7mx1#
您的测试无效,因为您的代码有错误。
当你使用
list()
时,你实际上是在“具体化”所有的结果页面,你的代码不是在遍历行,而是检索所有的行。驱动程序会在后台自动提取下一页,直到没有更多的页可供提取。看起来可能不是这样,但实际上每页只包含
fetch_size
行。检索下一页的过程是透明的,所以对你来说,结果似乎根本没有被分页,但驱动程序的自动行为正按设计的那样工作。干杯!