DynamoDB 更新所有项目的一列
DynamoDB update one column of all items
我们有一个巨大的 DynamoDB table(约 40 亿项),其中一列是某种类别(字符串),我们想将此列映射到任一新列 category_id(整数)或将现有的从字符串更新为 int。有没有一种方法可以有效地做到这一点,而无需创建新的 table 并从头开始填充它。换句话说更新现有的 table?
Is there a way to do this efficiently
不在 DynamoDB 中,该用例不是它的设计目的...
另请注意,除非您谈论的是散列键或排序键(table 或现有索引的),否则 DDB 没有列。
你会 运行 Scan()
(在一个循环中,因为它只有 returns 1MB 的数据)...
然后一次更新每个项目 1。 (请注意,一次可以批量更新 10 个项目,但这只节省了网络开销……仍然进行 10 个单独的更新)
如果相关属性用作 table 或现有索引中的键...那么新的 table 是您唯一的选择。这是一个 good article 和迁移生产 table 的策略。
- 创建一个新的 table(让我们称之为 NewTable),具有所需的键结构、LSI、GSI。
- 在原始 table
上启用 DynamoDB 流
- 将 Lambda 关联到 Stream,这会将记录推送到 NewTable。 (此 Lambda 应 trim 关闭步骤 5 中的迁移标志)
- [可选] 在原始 table 上创建 GSI 以加快扫描项目的速度。确保此 GSI 仅具有属性:主键和已迁移(请参阅步骤 5)。
- 扫描在上一步中创建的 GSI(或整个 table)并使用以下过滤器:
过滤器表达式 = "attribute_not_exists(Migrated)"
使用迁移标志更新 table 中的每个项目(即:“Migrated”: { “S”: “0” },将其发送到 DynamoDB Streams(使用 UpdateItem API,以确保没有发生数据丢失)。
注意 您可能希望在更新期间增加 table 上的写入容量单位。
- Lambda 将拾取所有项目,trim 关闭 Migrated 标志并将其推送到 NewTable。
- 迁移完所有项目后,将代码重新指向新 table
- 删除原来的 table,Lambda 函数一旦满意就很好。
我们有一个巨大的 DynamoDB table(约 40 亿项),其中一列是某种类别(字符串),我们想将此列映射到任一新列 category_id(整数)或将现有的从字符串更新为 int。有没有一种方法可以有效地做到这一点,而无需创建新的 table 并从头开始填充它。换句话说更新现有的 table?
Is there a way to do this efficiently
不在 DynamoDB 中,该用例不是它的设计目的...
另请注意,除非您谈论的是散列键或排序键(table 或现有索引的),否则 DDB 没有列。
你会 运行 Scan()
(在一个循环中,因为它只有 returns 1MB 的数据)...
然后一次更新每个项目 1。 (请注意,一次可以批量更新 10 个项目,但这只节省了网络开销……仍然进行 10 个单独的更新)
如果相关属性用作 table 或现有索引中的键...那么新的 table 是您唯一的选择。这是一个 good article 和迁移生产 table 的策略。
- 创建一个新的 table(让我们称之为 NewTable),具有所需的键结构、LSI、GSI。
- 在原始 table 上启用 DynamoDB 流
- 将 Lambda 关联到 Stream,这会将记录推送到 NewTable。 (此 Lambda 应 trim 关闭步骤 5 中的迁移标志)
- [可选] 在原始 table 上创建 GSI 以加快扫描项目的速度。确保此 GSI 仅具有属性:主键和已迁移(请参阅步骤 5)。
- 扫描在上一步中创建的 GSI(或整个 table)并使用以下过滤器:
过滤器表达式 = "attribute_not_exists(Migrated)"
使用迁移标志更新 table 中的每个项目(即:“Migrated”: { “S”: “0” },将其发送到 DynamoDB Streams(使用 UpdateItem API,以确保没有发生数据丢失)。
注意 您可能希望在更新期间增加 table 上的写入容量单位。
- Lambda 将拾取所有项目,trim 关闭 Migrated 标志并将其推送到 NewTable。
- 迁移完所有项目后,将代码重新指向新 table
- 删除原来的 table,Lambda 函数一旦满意就很好。