我需要将数据从表A迁移到表B。
我需要将表A中的每个项目(具有最大范围的键)移动到表B。
也就是说,每个只有最大版本的项目都位于表B中。
我已经考虑过扫描表A,然后对表B进行有条件的写操作(如果只有该项目存在且该项目的rangeKey值较小,或者该项目根本不存在,则进行写操作),但这似乎不可行,因为它花费的时间太长(表A很大)。
有更好的方法吗?
谢谢!
答案 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
希望有帮助。