gpt4 book ai didi

python - 使用 Python 从 dynamodb 中检索 500 个项目的简单示例

转载 作者:太空狗 更新时间:2023-10-29 20:52:29 26 4
gpt4 key购买 nike

寻找一个从 dynamodb 中检索 500 项的简单示例,以最大限度地减少查询次数。我知道有一个“multiget”函数可以让我将其分解为 50 个查询的 block ,但不确定如何执行此操作。

我从 500 个键的列表开始。然后我正在考虑编写一个函数,它接受这个键列表,将其分解为“ block ”,检索值,将它们重新拼接在一起,并返回一个包含 500 个键值对的字典。

或者有更好的方法吗?

作为推论,之后我将如何“排序”这些项目?

最佳答案

根据您的方案,有 2 种方法可以有效地检索您的 500 件元素。

1 项在相同的 hash_key 下,使用 range_key

  • 使用query方法和hash_key
  • 您可能会要求对 range_keys A-Z 或 Z-A 进行排序

2 个项目在“随机”键上

  • 你说了算:使用BatchGetItem方法
  • 好消息:限制实际上是 100/请求或最大 1MB
  • 您必须在 Python 端对结果进行排序。

在实践方面,由于您使用 Python,我强烈推荐 Boto library用于低级别访问或 dynamodb-mapper library用于更高级别的访问(免责声明:我是 dynamodb-mapper 的核心开发人员之一)。

遗憾的是,这些库都没有提供包装 batch_get 操作的简单方法。相反,有一个用于 scanquery 的生成器,它“假装”您在单个查询中获得所有内容。

为了通过批量查询获得最佳结果,我推荐这个工作流程:

  • 提交包含所有 500 件商品的批处理。
  • 将结果存储在你的字典中
  • 根据需要多次使用 UnprocessedKeys 重新提交
  • 在 python 端对结果进行排序

快速示例

我假设您已经使用单个 hash_key

创建了一个表“MyTable”
import boto

# Helper function. This is more or less the code
# I added to devolop branch
def resubmit(batch, prev):
# Empty (re-use) the batch
del batch[:]

# The batch answer contains the list of
# unprocessed keys grouped by tables
if 'UnprocessedKeys' in prev:
unprocessed = res['UnprocessedKeys']
else:
return None

# Load the unprocessed keys
for table_name, table_req in unprocessed.iteritems():
table_keys = table_req['Keys']
table = batch.layer2.get_table(table_name)

keys = []
for key in table_keys:
h = key['HashKeyElement']
r = None
if 'RangeKeyElement' in key:
r = key['RangeKeyElement']
keys.append((h, r))

attributes_to_get = None
if 'AttributesToGet' in table_req:
attributes_to_get = table_req['AttributesToGet']

batch.add_batch(table, keys, attributes_to_get=attributes_to_get)

return batch.submit()

# Main
db = boto.connect_dynamodb()
table = db.get_table('MyTable')
batch = db.new_batch_list()

keys = range (100) # Get items from 0 to 99

batch.add_batch(table, keys)

res = batch.submit()

while res:
print res # Do some usefull work here
res = resubmit(batch, res)

# The END

编辑:

我已经 added a resubmit() function到 Boto 开发分支中的 BatchList。它大大简化了工作流程:

  1. 将您请求的所有键添加到BatchList
  2. 提交()
  3. resubmit() 只要它不返回 None。

这应该在下一个版本中可用。

关于python - 使用 Python 从 dynamodb 中检索 500 个项目的简单示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12122006/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com