【问题标题】:How to get nth record from result set of aerospike scan() output in Python, without looping through all results?如何从 Python 中的 aerospike scan() 输出的结果集中获取第 n 条记录,而不遍历所有结果?
【发布时间】:2019-01-05 12:21:50
【问题描述】:

可能是python的初学者问题。

我可以像这样迭代 aerospike db 查询的结果 -

client = aerospike.client(config).connect()

scan = client.scan('namespace', 'setName')

scan.select('PK','expiresIn','clientId','scopes','roles')  # scan from aerospike


scan.foreach(process_result)

def process_result((key, metadata, record)):
       expiresIn = record.get("expiresIn")

现在,我要做的就是从这组中获取第 n 条记录,而不必遍历所有记录。

我尝试查看Get the nth item of a generator in Python,但没有多大意义。

【问题讨论】:

    标签: python aerospike


    【解决方案1】:

    扫描操作的结果来自集群中的所有节点,流水线,没有特定的顺序。从这个意义上说,第一条记录和第N条记录在排序方面没有区别。没有顺序。

    我写了一些关于如何对扫描或查询结果进行排序的 Medium 帖子:

    【讨论】:

    • 我只需要在大小为 n 的结果集中随机选择 10 条记录并获取主键,然后在另一个预期具有相同数据的数据库中比较相同的记录。我们基本上是从 aerospike 迁移到其他数据库,这是完整性检查的一部分。
    • 您当然可以在获得 10 条记录后终止扫描调用,一旦您停止在客户端消耗扫描输出,服务器上的扫描作业最终将被终止 - 我认为它之前 10 秒左右的管道已满它宣布放弃并杀死它。
    • 所以你的意思是每次我遍历扫描调用的输出时,我已经在遍历一个随机列表了?那么,如果我再次调用扫描作业,一段时间后使用相同的脚本,我会得到一个新订单吗?调用 close() 是否确保相同,而不必等待那个时间?
    • 纠正我的理解 - 每次我在该时间间隔之后调用 scan() ?
    • 可以说该列表不能保证按顺序重复。此外,如果下面的集群在活动扫描作业期间经历了重新平衡事件,您可能会得到重复或丢失的记录,除非您将 failOnClusterChange 设置为 true。
    【解决方案2】:

    像往常一样,解决方法是将扫描策略设置为只返回摘要,将它们存储为一个列表(或具有较小列表的多个记录),并在批量读取的那些上分页。您可以设置合理的 TTL,以便此结果集具有合理的时间长度。

    如果需要,我可以提供示例代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-05
      • 1970-01-01
      • 1970-01-01
      • 2015-02-09
      相关资源
      最近更新 更多