amazon-web-services - DynamoDB Client.Scan() 未返回 LastEvaluatedKey 参数
问题描述
我有一张有 10k 行的表。我正在尝试解析它们以使用 Python 更改属性(每行内)内的一个小东西,所以我使用 client.scan() 批量处理 10 行并将“LastEvaluatedKey”参数提供给 next 。扫描()。
问题是 40 行后 scan() 不会返回 lastKey,就像 DB 一样,它只有 40 行长。
我注意到针对另一个表启动相同的脚本,大 3 倍,停止发生在 120 行(大 3 倍)。
该表具有按需容量。
对此有任何想法吗?
client = boto3.client('dynamodb')
resource = boto3.resource('dynamodb')
table = resource.Table(table_name)
remaining = 3961
iteration = 0
limit = 10
while remaining > 0:
# retrieve Limit
if iteration == 0:
response = client.scan(
TableName=table_name,
Limit=limit,
Select='ALL_ATTRIBUTES',
ReturnConsumedCapacity='TOTAL',
TotalSegments=123,
Segment=122,
)
key = response["LastEvaluatedKey"]
else:
response = client.scan(
TableName=table_name,
Limit=limit,
Select='ALL_ATTRIBUTES',
ExclusiveStartKey=key,
ReturnConsumedCapacity='TOTAL',
TotalSegments=123,
Segment=122,
)
key = response["LastEvaluatedKey"]
iteration += 1
for el in response["Items"]:
print(el)
解决方案
我认为有两个问题:
您似乎在限制扫描:尝试删除它
您正在运行并行扫描并始终扫描最后一段:
总段数=123 段数=122
我不确定你的表有多大,但 123 个段相当多,而且我没有看到你扫描任何其他段,从 0 到 121。
试试这个:
iteration = 0
response = client.scan(
TableName=table_name,
Select='ALL_ATTRIBUTES',
ReturnConsumedCapacity='TOTAL'
)
while True:
iteration += 1
for el in response["Items"]:
print(el)
last_key = response["LastEvaluatedKey"]
if not last_key:
break
response = client.scan(
TableName=table_name,
Select='ALL_ATTRIBUTES',
ExclusiveStartKey=last_key,
ReturnConsumedCapacity='TOTAL'
)
我希望以上内容可以检索表中的所有项目。然后,如果你仍然想运行并行扫描,你可以这样做,但你必须处理分割成段,为了提高效率,你必须同时处理运行那些(更复杂的操作比顺序扫描)。
推荐阅读
- python - 我在 Python 中遇到了重复函数的问题
- javascript - 当用户浏览网站时如何保留查询字符串参数
- ffmpeg - ffmpeg 编解码转换;无法配置编码器
- java - 根据条件链接可完成的期货
- android - 使用 okhttp 从异步调用填充列表视图
- powershell - Powershell 和正则表达式解析配置并显示配置了 ospf 的界面
- python - 十六进制到字符串的转换
- c++ - 有符号双字节到无符号字节:ARM64 与 Win64
- output - pmap 数据格式(Julia 1.1.0)
- c# - 始终不一致的 MySQL 查询结果 - 返回 0 对 n 行