【问题标题】:DynamoDB - overwrite HashKey with batch operationDynamoDB - 使用批处理操作覆盖 HashKey
【发布时间】:2015-07-28 13:18:38
【问题描述】:

我有一个 DynamoDB,我用它来存储有关 EC2 实例的一些信息,所以我使用实例 ID 作为 HashKey。

每周一次,我运行一个代码,将很多记录插入到这个表中:

AmazonDynamoDB amazonDynamoDB = new AmazonDynamoDBClient();
DynamoDBMapper mapper = new DynamoDBMapper(amazonDynamoDB);

// saving records
List<FailedBatch> failedBatch = mapper.batchSave(recordsToSave);

我只关心最新信息,因此如果我尝试插入的 HashKey 已存在于数据库中,我想覆盖 DynamoDB 中的旧记录。但是,每次我尝试插入这样的值时,操作都会失败(faildBatch),因为它无法处理重复。

有没有办法通过 DynamoDB 实现这种行为,还是我必须更改表设计?

【问题讨论】:

  • 你有具体的错误吗?您应该能够使用批处理请求替换项目,但是使用批处理操作时,某些功能(例如条件写入)不可用。
  • BatchWriteItem 绝对能够覆盖表中的现有项目。关于重复的错误听起来就像您在一个批次中包含对同一个哈希键的多次写入。
  • 这与第二个答案相矛盾...您能否在文档中提供一些证据来支持这一说法?我还没有找到。
  • “记录已存在于表中”在 BatchWriteItem 调用可能被拒绝here 的原因列表中明显缺失,但它确实表示如果“您尝试执行在同一个 BatchWriteItem 请求中对同一个项目进行多次操作。例如,您不能在同一个 BatchWriteItem 请求中放置和删除同一个项目。使用小型集成测试验证覆盖是否有效也很容易。
  • 这些都是拒绝整批的理由。如果批次被接受,某些事情可能仍然失败......我想这就是我们在这种情况下看到的

标签: java amazon-web-services amazon-dynamodb


【解决方案1】:

批处理操作无法更新项目。见:

http://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_BatchWriteItem.html

BatchWriteItem 无法更新项目。要更新项目,请使用 UpdateItem API。

我会做的是:

  • 尝试批量写入
  • 查看再次出现的故障
  • 批量获取失败项并批量写入临时表
  • 批量写入删除所有失败的项目(已经存在)
  • 将失败再次批量写入主表
  • 清除临时表中的所有项目

作为替代方案,您可以使用 UpdateItem api,但这可能会更慢。

【讨论】:

  • 哦,谢谢你的回答......我真的希望有一些更简单的解决方案,但我想这是唯一的方法。
  • 该引用中的 "Update" 表示项目的部分更新(UpdateItem 所做的),而不是项目的完全覆盖(PutItem 和 BatchWriteItem 所做的)。他们的措辞方式并不是最清楚的。 :(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-25
  • 1970-01-01
  • 2019-12-13
  • 2013-10-17
相关资源
最近更新 更多