DynamoDB数据迁移与转换

时间:2019-05-23 19:24:37

标签: amazon-web-services amazon-s3 amazon-dynamodb etl

我需要将数据从表A迁移到表B。

我需要将表A中的每个项目(具有最大范围的键)移动到表B。

也就是说,每个只有最大版本的项目都位于表B中。

我已经考虑过扫描表A,然后对表B进行有条件的写操作(如果只有该项目存在且该项目的rangeKey值较小,或者该项目根本不存在,则进行写操作),但这似乎不可行,因为它花费的时间太长(表A很大)。

有更好的方法吗?

谢谢!

2 个答案:

答案 0 :(得分:1)

是的,它可以更高效地完成,但是首先,您需要获取存储在表中的所有分区键值。

如果您还不知道这些值,则需要scan表并提取这些唯一值,可以使用ProjectionExpression仅返回分区键值。

Python示例

def get_partition_key_values():
    response = dynamodb_client.scan(
        TableName=SOURCE_TABLE,
        ProjectionExpression=PARTITION_KEY_NAME
    )

    values = [item[PARTITION_KEY_NAME][PARTITION_KEY_TYPE]
              for item in response['Items']]
    return set(values)

现在有了分区键值,您可以简单地在循环中查询表中的每个唯一分区键,使用设置为ScanIndexForward的{​​{1}}属性和False属性的数量对结果进行排序的返回值返回到Limit,每个分区键将使用“最大”排序键返回一项。

当您遍历键并获取所需项目时,可以将它们逐一放入目标表中

1

这是完整的代码

def copy_items(partition_keys):
    for key in partition_keys:
        item = dynamodb_client.query(
            TableName=SOURCE_TABLE,
            KeyConditionExpression='#pid = :pid',
            ExpressionAttributeNames={
                '#pid': PARTITION_KEY_NAME
            },
            ExpressionAttributeValues={
                ':pid': {
                    PARTITION_KEY_TYPE: key
                }
            },
            Limit=1,
            ScanIndexForward=False
        )['Items'][0]

        dynamodb_client.put_item(
            TableName=DESTINATION_TABLE,
            Item=item
        )

请注意,上面的代码假定源表和目标表都具有相同的主键架构。如果这两种模式因您的情况而异,那么您将需要执行一些其他的转换/映射。

答案 1 :(得分:0)

这是我们的工作方式。

  

Lambda(用于扫描和删除旧记录)-> DynamoDB流-> Lambda   进行写入(DO转换并写入新表)

如果您具有动态配置的分区和容量,则可以触发多个lambda来处理不同的分区并相应地删除数据。

以上是一种简单的方法。

您也可以通过数据管道进行此操作。

  

使用数据管道导出DynamoDB记录-> S3->使用   Lambda并将其写入S3->使用数据管道导入

https://docs.aws.amazon.com/datapipeline/latest/DeveloperGuide/dp-importexport-ddb.html

希望有帮助。