Да, это можно сделать более эффективно, но сначала вам нужно получить все значения ключа раздела, которые вы храните в своей таблице.
Если вы еще не знаете значения, вам потребуется 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
, установленного на 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
)
Вот полный код
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)
Просто обратите внимание, что в приведенном выше коде предполагается, что и таблица источника, и таблица назначения имеют одинаковую схему первичного ключа,Если эти две схемы отличаются в вашем случае, вам потребуется выполнить дополнительное преобразование / отображение.