簡體   English   中英

DynamoDB數據遷移與轉換

[英]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屬性對結果進行排序,並將返回值的數量Limit1 ,這將為每個分區鍵返回一項, “最大”排序鍵。

當您遍歷鍵並獲取所需項時,可以將它們逐一放入目標表中

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM