[英]DynamoDB Data migration with transformation
我需要將數據從表A遷移到表B。
我需要將表A中的所有項目(具有最大rangeKey)移到表B中。
也就是說,只有最大版本的每個項目都將駐留在表B中。
我已經考慮過掃描表A,然后對表B進行條件寫(如果只有該項目存在且該項目的rangeKey值較小,或者該項目根本不存在,則寫入)不可行,因為這花費了太長時間(表A很大)。
有一個更好的方法嗎 ?
謝謝!
是的,它可以更高效地完成,但是首先您需要獲取存儲在表中的所有分區鍵值。
如果您還不知道這些值,則需要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)
有了分區鍵值之后,您可以簡單地在循環中查詢表中每個唯一分區鍵的值,使用設置為False
ScanIndexForward
屬性對結果進行排序,並將返回值的數量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
)
這是完整的代碼
import boto3
dynamodb_client = boto3.client('dynamodb')
SOURCE_TABLE = 'products'
DESTINATION_TABLE = 'products_copy'
PARTITION_KEY_NAME = 'product_id'
PARTITION_KEY_TYPE = 'S'
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)
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
)
unique_partition_key_values = get_partition_key_values()
copy_items(unique_partition_key_values)
請注意,上面的代碼假定源表和目標表都具有相同的主鍵架構。 如果這兩種模式因您的情況而異,那么您將需要執行一些其他的轉換/映射。
這是我們的方法。
Lambda(用於掃描和刪除舊記錄)-> DynamoDB流->要寫入的Lambda(DO轉換並寫入新表)
如果您具有動態配置的分區和容量,則可以觸發多個lambda來處理不同的分區並相應地刪除數據。
以上是一種簡單的方法。
您也可以通過數據管道進行。
使用數據管道導出DynamoDB記錄-> S3->使用Lambda進行轉換並將其寫入S3->使用數據管道導入
https://docs.aws.amazon.com/datapipeline/latest/DeveloperGuide/dp-importexport-ddb.html
希望能幫助到你。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.