La lista proporcionada de claves de elementos contiene duplicados (BatchGetItem)
TL;DR: su matriz BatchGetItem Keys para una tabla enumera la misma clave principal más de una vez. DynamoDB requiere que cada clave de un lote sea única y rechaza toda la solicitud; no descarta al incauto silenciosamente. Elimina los duplicados de la lista de claves antes de enviarla.
Qué significa
ValidationException: Provided list of item keys contains duplicatesBatchGetItem lee hasta 100 Items entre tablas. Dentro de la lista Keys de una sola tabla, cada entrada debe ser una clave primaria distinta (clave de partición, o partición + ordenación en tablas compuestas). Dos entradas que resuelven a la misma clave disparan este ValidationException HTTP 400, y toda la llamada falla — no se devuelve ningún Item. No se puede reintentar tal cual.
Por qué ocurre
- La misma clave aparece dos veces en la lista — a menudo porque los IDs se recopilaron de varias fuentes y nunca se fusionaron.
- Una lista de claves generada (p. ej. mapear una lista de registros a claves) cuyo origen tenía filas duplicadas.
- Confusión de clave compuesta — dos entradas comparten la clave de partición pero olvidaste que la clave de ordenación difiere; o ambas son genuinamente idénticas.
- Diferencias de mayúsculas / tipo que enmascaran un duplicado real — dos claves que se marshalean al mismo valor.
- Tuberías de carga (Glue, ETL propio) que agrupan claves sin un paso de deduplicación.
Cómo solucionarlo
- Deduplica antes de la llamada. Indexa cada entrada por un string estable y conserva una:
const seen = new Set(); const keys = raw.filter((k) => { const id = `${k.pk.S}#${k.sk?.S ?? ''}`; if (seen.has(id)) return false; seen.add(id); return true; }); - Recuerda que un lote es un conjunto, no una bolsa — solo necesitas una lectura por clave; el Item vuelve una vez, pase lo que pase.
- Trocea a 100 claves por
BatchGetItemy gestionaUnprocessedKeysen la respuesta (throttling, no duplicados). - Protege tu ETL/cargador con la misma deduplicación para que el problema no pueda repetirse aguas arriba.
- Registra el tamaño de la lista de claves antes de cada lote. Cuando se cuela un duplicado, el error no da ningún índice — tus logs son los que deben mostrar qué fuente aguas arriba repitió un ID.
Ruta en DynoTable
Antes de leer claves por lotes contra producción, detecta los duplicados en DynoTable — abre la tabla con ⌘K, filtra por los IDs que piensas traer y confirma que cada clave primaria aparece una sola vez. La lista de Items muestra la clave de partición y la de ordenación una al lado de la otra, así que las colisiones de clave compuesta se ven a simple vista.
Cuando pases la lectura a código, usa el Query Builder para prototipar primero lecturas de una sola clave y luego escalar a un BatchGetItem troceado. Cambia de perfil con ⌘P; configúralos en Settings → Profiles con Test Connection. Consulta Conectar con AWS e Instalación.
Fuentes
- BatchGetItem — Amazon DynamoDB API Reference (verificado el 2026-07-13)
- Error handling with DynamoDB (verificado el 2026-07-13)
Errores relacionados
- Provided list of item keys contains duplicates (BatchWriteItem) — la misma regla en la ruta de escritura.
- ValidationException (visión general)
- Ejemplo de código: BatchGetItem en Node.js — una lectura por lotes troceada correcta para adaptar.
- Aprende: Operaciones por lotes
Referencias
- BatchGetItem — Amazon DynamoDB API Reference
- BatchWriteItem — Amazon DynamoDB API Reference
- Error handling with DynamoDB — Amazon DynamoDB Developer Guide
Verificado por última vez el 2026-07-13 contra la documentación oficial de AWS enlazada arriba.