【问题标题】:Cassandra Python driver doesn't page large queriesCassandra Python 驱动程序不会分页大型查询
【发布时间】:2022-08-10 15:21:48
【问题描述】:

documentation 中说,当查询足够大(default_fetch_size 为 5000 行)时,cassandra-driver 会自动分页,并将返回PagedResult

我已经测试了从本地 Cassandra 读取数据,其中包含 9999 行 SimpleStatement 和我自己的提取大小,但它返回了 ResultSet(9999 行)而不是页面(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 行。


我的目标不是限制我的 fetch 查询中的行,例如SELECT * FROM user LIMIT 10。我想要的是逐页获取行以避免内存过载。

那么究竟发生了什么?

注意:我使用 Cassandra-Driver 3.25 for Python 并使用 Python3.7

如果我的附加信息仍然不能使我的问题成为一个好问题,我很抱歉。我以前从不问任何问题。所以......欢迎任何建议:)

  • 您能否添加一个最小的示例代码来复制问题但您正在使用的版本?这是关于如何提出好问题的友好说明。一般指导是您 (a) 提供一个很好的问题摘要,包括软件/组件版本、完整的错误消息 + 完整的堆栈跟踪; (b) 描述您尝试解决问题的方法、您所做调查的详细信息; (c) 复制问题的最小示例代码。干杯!
  • 感谢您的建议,我正在为我的问题添加详细信息

标签: cassandra datastax-python-driver


【解决方案1】:

您的测试无效,因为您的代码有问题。

当您list() 时,您实际上是在“实现”所有结果页面。您的代码不是遍历行而是检索所有行。

驱动程序会在后台自动获取下一页,直到没有更多页面要获取。它可能看起来不像,但每个页面只包含fetch_size 行。

检索下一页是透明地发生的,因此对您而言,结果似乎根本没有被分页,但驱动程序的自动行为正在按设计工作。干杯!

【讨论】:

  • 我明白了,但我想确认我所理解的。假设我第一次尝试迭代像for row in session.execute(statement) 这样的行(不再使用list()),它会迭代前10 行。由于总行数为 9999,它确实从 Cassandra 获取接下来的 10 行,重复该过程直到每一行都成功迭代?我对吗?
  • 正确,是的。驱动程序在您不知道的情况下获取下一页,因此是“透明的”。如果您继续前进,它将继续获取下一页,直到没有更多页面可供获取。干杯!
  • 啊,我忘了说这个,谢谢!
猜你喜欢
  • 1970-01-01
  • 2015-03-26
  • 2017-08-17
  • 2016-09-21
  • 2015-02-08
  • 2020-12-29
  • 2015-04-12
  • 2017-11-26
  • 2018-06-15
相关资源
最近更新 更多