Amazon web services 使用转换将DynamoDB表复制到另一个DynamoDB表

Amazon web services 使用转换将DynamoDB表复制到另一个DynamoDB表,amazon-web-services,amazon-dynamodb,amazon-data-pipeline,Amazon Web Services,Amazon Dynamodb,Amazon Data Pipeline,我有两张DynamoDB表:表1和表2。我试图反对表_1,并将信息从表_1复制到表_2中,表_1具有不同的GSI和LSI 表1属性为:Id、状态、已使用、空、正常 表2属性为:用户ID、状态、isOld、正常 Id映射到UserId,state映射到status,normal映射到normal,empty从表2中删除,如果state是“OLD”,那么isOld设置为true 从表_1导出此数据、对属性/数据进行转换,然后将信息加载回表_2中的最佳方法是什么 目前,我可以使用AWS数据管道使用给定

我有两张DynamoDB表:表1和表2。我试图反对表_1,并将信息从表_1复制到表_2中,表_1具有不同的GSI和LSI

表1属性为:Id、状态、已使用、空、正常

表2属性为:用户ID、状态、isOld、正常

Id映射到UserId,state映射到status,normal映射到normal,empty从表2中删除,如果state是“OLD”,那么isOld设置为true

从表_1导出此数据、对属性/数据进行转换,然后将信息加载回表_2中的最佳方法是什么

目前,我可以使用AWS数据管道使用给定的模板将数据从表1导入/导出到表2,但这不会进行转换。我猜我需要使用EMR来进行转换


我还使用DynamoDB streams来保持表的同步,但据我所知,DynamoDB streams只流更新的信息,而不是表中已经存在的信息

假设您只需要此数据移动一次,我可以想到两个选项:

  • 生成安装了配置单元的EMR群集。创建两个配置单元表,表1和表2各一个。然后,执行类似“插入到表2选择…”。。。来自表1’。这将使您能够完全控制所需的转换
  • 的确,只有更新的和新的项目被发送到DynamoDB流。如果已经有同步器设置,为什么不“更新”表1中的所有现有项一次?只需将一个虚拟字段添加到所有字段中,以便将它们推送到表_1的流中,之后它们将自动复制到表_2!只需确保同步器忽略此虚拟字段。这种方法的优点:
    • 他能很好地处理比赛情况
    • 根据您的业务逻辑,您可以快速检查表_1中的项目是否已同步到表_2。这使您可以自由地仅复制表_1中尚未在表_2中更新的项目

您可以编写一个脚本来查询表1中的所有项目,并用Java进行转换,而不是使用数据管道和编写EMR作业。在Java中完成转换后,执行条件put[1],仅更新表2中不存在的项。这将确保回填期间表1中所做的任何更改都将显示表2中的最新信息


()

数据管道不是解决方案,探索dynamo DBstreams@Shibashisstreams仅对原始表进行更新/修改,而不是对预先存在的数据进行更新/修改。我目前使用DynamoDB streams来保持新更新的同步。您可能需要为此创建自定义EMR作业。数据管道是一个没有定制的EMR作业。两个选项都有意义,但选项1似乎更安全,因为表1仍然是一个活动表,并且是一个权威数据源。对于选项1,由于在运行EMR作业/转换时仍对表1上的各个项目进行更新,您是否建议在回填过程中停止处理DynamoDB流?那么一旦回填完成,是否再次处理DynamoDB流更新?否则,在回填过程中对表_1中项目的更新可能不会反映在表_2中。“您是否建议在回填过程中停止处理DynamoDB流?”:我不认为这对比赛条件有什么帮助。例如,有1000个项目(i1、i2、i1000)。EMR处理i1到i500。现在,i5和i600有两个更新。由于EMR尚未处理i600,该项的更新值将复制到表2。但是您的流将同时具有这两个属性“表1仍然是一个活动表,并且是一个权威数据源”:我认为,这正是选项2更好的原因。我正在用它的优点更新我的答案。如果答案有帮助,请“投票”并“接受”: