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 (#filter0Year), lo que mantiene a salvo palabras reservadas como Year.
  • Paginación — cada página de Scan lee 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 un ScanIterable que sigue solicitando páginas hasta agotar LastEvaluatedKey — 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. Scan lee 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

References

Verificado por última vez el 2026-07-13 contra la documentación oficial de AWS enlazada arriba.

Construye esta solicitud visualmente

Compón esta operación en el Generador de consultas de DynamoDB gratuito —condición de clave, filtro, índice, Limit, orden de clasificación y un bucle de paginación— y cópiala de vuelta como un programa ejecutable para SDK v3, CLI o boto3.

Abrir el Generador de consultas de DynamoDB

Trabaja con DynamoDB sin la Consola

DynoTable es un cliente de escritorio rápido para DynamoDB: explora tablas, ejecuta consultas estilo SQL y edita Items localmente.