dynamodb python amazon-web-services amazon-dynamodb boto3

python - boto3 dynamodb



Escaneo completo de dynamoDb con boto3 (5)

Código para eliminar el tipo de formato dynamodb como @kungphu mencionado.

import boto3 from boto3.dynamodb.types import TypeDeserializer from boto3.dynamodb.transform import TransformationInjector client = boto3.client(''dynamodb'') paginator = client.get_paginator(''query'') service_model = client._service_model.operation_model(''Query'') trans = TransformationInjector(deserializer = TypeDeserializer()) for page in paginator.paginate(): trans.inject_attribute_value_output(page, service_model)

Mi mesa es de alrededor de 220 mb con 250k registros dentro de ella. Estoy tratando de tirar todos estos datos en python. Me doy cuenta de que esto debe ser un proceso por lotes fragmentado y en bucle, pero no estoy seguro de cómo puedo configurar los lotes para que comiencen donde lo dejó el anterior.

¿Hay alguna manera de filtrar mi escaneo? Por lo que he leído, el filtrado se produce después de la carga y la carga se detiene en 1 mb, por lo que no podría escanear objetos nuevos.

Cualquier ayuda sería apreciada.

import boto3 dynamodb = boto3.resource(''dynamodb'', aws_session_token = aws_session_token, aws_access_key_id = aws_access_key_id, aws_secret_access_key = aws_secret_access_key, region_name = region ) table = dynamodb.Table(''widgetsTableName'') data = table.scan()


Creo que la documentación de Amazon DynamoDB con respecto al escaneo de tablas responde a su pregunta.

En resumen, deberá verificar LastEvaluatedKey en la respuesta. Aquí hay un ejemplo usando tu código:

import boto3 dynamodb = boto3.resource(''dynamodb'', aws_session_token=aws_session_token, aws_access_key_id=aws_access_key_id, aws_secret_access_key=aws_secret_access_key, region_name=region ) table = dynamodb.Table(''widgetsTableName'') response = table.scan() data = response[''Items''] while ''LastEvaluatedKey'' in response: response = table.scan(ExclusiveStartKey=response[''LastEvaluatedKey'']) data.extend(response[''Items''])


Resulta que Boto3 captura la "LastEvaluatedKey" como parte de la respuesta devuelta. Esto se puede utilizar como punto de inicio para un escaneo:

data= table.scan( ExclusiveStartKey=data[''LastEvaluatedKey''] )

Planeo crear un bucle alrededor de esto hasta que los datos devueltos sean solo el ExclusiveStartKey


Riffing de la respuesta de Jordon Phillips, aquí es cómo pasaría un FilterExpression con la paginación:

import boto3 client = boto3.client(''dynamodb'') paginator = client.get_paginator(''scan'') operation_parameters = { ''TableName'': ''foo'', ''FilterExpression'': ''bar > :x AND bar < :y'', ''ExpressionAttributeValues'': { '':x'': {''S'': ''2017-01-31T01:35''}, '':y'': {''S'': ''2017-01-31T02:08''}, } } page_iterator = paginator.paginate(**operation_parameters) for page in page_iterator: # do something


boto3 ofrece paginadores que manejan todos los detalles de la paginación por ti. Here está la página doc para el paginador de escaneo. Básicamente, lo usarías así:

import boto3 client = boto3.client(''dynamodb'') paginator = client.get_paginator(''scan'') for page in paginator.paginate(): # do something