DynamoDB Scan en Java (AWS SDK v2)
Scan lee todos los items de una tabla o índice, página a página, y luego descarta filas opcionalmente con un FilterExpression. En AWS SDK para Java 2.x construyes un ScanRequest y dejas que el scanPaginator integrado siga LastEvaluatedKey hasta que se lee toda la tabla.
Code
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.dynamodb.DynamoDbClient;
import software.amazon.awssdk.services.dynamodb.model.AttributeValue;
import software.amazon.awssdk.services.dynamodb.model.DynamoDbException;
import software.amazon.awssdk.services.dynamodb.model.ScanRequest;
import software.amazon.awssdk.services.dynamodb.model.ScanResponse;
public class ScanExample {
public static void main(String[] args) {
try (DynamoDbClient ddb = DynamoDbClient.builder()
.region(Region.US_EAST_1)
.build()) {
Map<String, String> names = new HashMap<>();
names.put("#filter0", "Year");
Map<String, AttributeValue> values = new HashMap<>();
values.put(":filterValue0", AttributeValue.builder().n("2010").build());
ScanRequest request = ScanRequest.builder()
.tableName("Music")
.filterExpression("#filter0 >= :filterValue0")
.expressionAttributeNames(names)
.expressionAttributeValues(values)
.build();
List<Map<String, AttributeValue>> items = new ArrayList<>();
for (ScanResponse page : ddb.scanPaginator(request)) {
items.addAll(page.items());
}
System.out.println("Matched " + items.size() + " items");
} catch (DynamoDbException e) {
System.err.println(e.getMessage());
}
}
}Explicación
filterExpression— se aplica después de la lectura, en el servidor. Reduce la respuesta pero no el coste: pagas por leer todos los items escaneados, filtrados o no.expressionAttributeNames— el atributo filtrado lleva un alias (#filter0→Year), lo que mantiene a salvo palabras reservadas comoYear.- Paginación — cada página de
Scanlee como máximo 1 MB antes de filtrar, así que una página filtrada puede volver vacía mientras la tabla aún tiene coincidencias.ddb.scanPaginator(request)devuelve unScanIterableque sigue solicitando páginas hasta agotarLastEvaluatedKey— nunca te pares en la primera página. - Añade
.limit(...)para limitar los items escaneados por página (antes del filtro) — no limita los items devueltos. - Para un scan grande de la tabla completa, reparte el trabajo entre workers con
.segment(...)/.totalSegments(...)(un scan en paralelo). - Prefiere
Query.Scanlee toda la tabla; en cualquier cosa que no sea una tabla diminuta es lento y caro.
Hazlo visualmente
¿Montando un filtro a mano? El DynamoDB Expression Builder construye el FilterExpression + los mapas de nombres/valores y copia código ejecutable.
Para explorar tablas en una interfaz gráfica — con cuadrículas de resultados filtradas y paginadas y copiar como código — descarga DynoTable, en lugar de escanear a ciegas desde un script.
Ejemplos relacionados
- DynamoDB Scan en Go — el mismo scan con AWS SDK para Go v2.
- DynamoDB Query en Java — la lectura más barata a la que normalmente deberías recurrir.
- Query vs. Scan — cuándo (rara vez) se justifica un
Scan. - ¿Por qué mi DynamoDB Scan es lento y caro? — el modelo de costes y cómo evitarlo.
- DynamoDB ProvisionedThroughputExceededException — lo que un scan de tabla completa le hace a la capacidad de una tabla aprovisionada.
- DynamoDB ThrottlingException — el otro throttle, y cómo lo gestiona el retroceso exponencial.
References
- Scan — Amazon DynamoDB API Reference
- Use Scan with an AWS SDK or CLI — Amazon DynamoDB Developer Guide
- DynamoDbClient — AWS SDK for Java 2.x API Reference
- ScanRequest — AWS SDK for Java 2.x API Reference
- Scanning tables — Amazon DynamoDB Developer Guide
Verificado por última vez el 2026-07-13 contra la documentación oficial de AWS enlazada arriba.