首页 > 解决方案 > 无论键或条件如何,如何更新 DynamoDB 表中的属性?

问题描述

我有一个 DynamoDB 表说data。该表有 400k 项。每个项目有 4 个字段 -

现在所有项目都有一个status=“Y”。无论密钥或任何条件如何,如何更新所有项目并将所有 400k 项目的状态设置为“N”?

在 MySQL 中,等效的语句是 -

UPDATE data SET status = 'N';

我希望通过命令行或在 python 中使用 boto3 来完成它

标签: pythonamazon-web-servicesamazon-dynamodbboto3

解决方案


没有简单或便宜的方法来做你想做的事。您基本上需要做的是读取写入整个数据库:

  1. 如果您知道单个项目的密钥,则可以使用of进行UpdateItem请求。这只会修改“状态”属性(其余部分保持不变),但您将产生的成本(或您将使用的预置吞吐量)将是编写整个项目的成本。所以所有这些操作的总和将是重写整个数据库的成本。UpdateExpression"set status = :N"
  2. 您应该在上面添加UpdateItema ConditionExpression,仅当该项目实际仍然存在时才更新该项目(您可以使用attribute_exists()其 key 属性上的条件来验证项目是否存在)。这将允许您的工作负载在进行这些更改时删除项目。
  3. 在开始此更改过程之前,更改您的客户端代码以编写状态 = N 的项目。更改过程可能会丢失这些新项目,但如果它们已经创建状态 = N 也没关系。
  4. 您不能使用BatchWriteItems( batch_writer()in boto3) 一起修改一组项目,因为此批量操作只能替换项目 - 不能修改现有项目的属性。在任何情况下, aBatchWriteItems都不会降低成本(批次成本与它们包含的请求相同)。

阅读

  1. 要获取数据库中所有现有键的列表,要进行上述读取,您需要使用一个Scan操作,Projection设置为KEYS_ONLY仅获取键(您不需要数据)。不幸的是,您的成本将与阅读整个项目相同,而不仅仅是阅读钥匙。所以所有这些 Scan 操作的成本总和将是读取整个数据库。

如果您为此表使用预置容量,则可以使用客户端请求未使用的任何多余容量在后台缓慢地进行此更改,基本上是“免费”的。

这在您的情况下是否有意义实际上取决于您提供了多少过剩容量(读取和写入!)。如果你这样做,你需要注意不要为这个后台操作使用太多容量并伤害你的真实用户 - 你需要有某种控制器来通知容量超出错误并减少容量由后台进程使用。

如果您实际上有很多已经支付的超额预置容量,您可以随心所欲地执行此后台操作!读取部分 aScan可以尽可能快地并行完成(使用“并行扫描”功能),并且不同键的写入部分显然也可以并行完成。


推荐阅读