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