DynamoDB 更新所有项目的一列



我们有一个巨大的 DynamoDB 表(~ 40 亿个项目(,其中一列是某种类别(字符串(,我们希望将此列映射到新的列category_id(整数(或将现有列从字符串更新为 int。有没有办法在不创建新表并从头开始填充它的情况下有效地做到这一点。换句话说,要更新现有表?

有没有办法有效地做到这一点

不是在 DynamoDB 中,该用例不是它的设计目的...

另请注意,除非您谈论的是(表或现有索引的(哈希或排序键,否则 DDB 没有列。

您将运行Scan()(在循环中,因为它只返回 1MB 的数据(...

然后一次更新 1 个项目。 (注意一次可以批量更新 10 个项目,但这只能节省网络开销。仍然做 10 个单独的更新(

如果相关属性用作表中的键或现有索引...那么新表是您唯一的选择。 这是一篇很好的文章,其中包含迁移生产表的策略。

  1. 创建一个新表(我们称之为NewTable(,具有所需的键结构,LSI,GSI。
  2. 在原始表上启用 DynamoDB 流
  3. 将 Lambda 关联到流,这会将记录推送到 NewTable 中。(此 Lambda 应在步骤 5 中修剪迁移标志(
  4. [可选] 在原始表上创建 GSI 以加快扫描项目的速度。确保此 GSI 仅具有以下属性:主键和已迁移(请参阅步骤 5(。
  5. 扫描在上一步(或整个表(中创建的 GSI,并使用以下过滤器:
    FilterExpression ="attribute_not_exists(已迁移("使用迁移标志(即:"已迁移":{"S": "0">
    }(更新表中的每个项目,这会将其发送到 DynamoDB 流(使用 UpdateItem API,以确保不会发生数据丢失(。

注意:在更新期间,您可能希望增加表上的写入容量单位。

  1. Lambda 将拾取所有项目,修剪迁移标志并将其推送到 NewTable 中。
  2. 迁移完所有项后,将代码重新指向新表
  3. 删除原始表,Lambda函数一旦满意就很好。

最新更新