BatchWriteItem
importante
Esta sección se refiere a la versión 2011-12-05 del API, que está obsoleta y no debe utilizarse para nuevas aplicaciones.
Para consultar la documentación sobre la API de bajo nivel actual, consulte la Referencia de la API de Amazon DynamoDB.
Descripción
Esta operación permite colocar o eliminar varios elementos en una o varias tablas con una sola llamada.
Para cargar un elemento, puede utilizar PutItem
y para eliminar un elemento, puede utilizar DeleteItem
. Sin embargo, si desea cargar o eliminar grandes cantidades de datos, como, por ejemplo, cargar grandes cantidades de datos desde Amazon EMR (Amazon EMR) o migrar datos desde otra base de datos a DynamoDB, BatchWriteItem
ofrece una alternativa eficiente.
Si utiliza lenguajes como Java, puede usar hilos para cargar los elementos en paralelo. Esto agrega complejidad a la aplicación, porque debe encargarse de los hilos. Otros lenguajes no admiten los hilos. Por ejemplo, si utiliza PHP, debe cargar o eliminar los elementos uno por uno. En ambos casos, BatchWriteItem
proporciona una alternativa para procesar en paralelo las operaciones de colocación y eliminación, por lo que aporta la potencia de un grupo de subprocesos sin tener que aumentar la complejidad de la aplicación.
Tenga en cuenta que cada una de las operaciones individuales de colocación y eliminación que se especifican en una operación BatchWriteItem
cuesta lo mismo en términos de unidades de capacidad consumidas. Sin embargo, puesto que BatchWriteItem
lleva a cabo las operaciones especificadas en paralelo, se consigue una latencia menor. Cada una de las operaciones de eliminación de elementos inexistentes consumen una unidad de capacidad de escritura. Para obtener más información sobre las unidades de capacidad provisionadas, consulte Uso de tablas y datos en DynamoDB.
Cuando utilice BatchWriteItem
, tenga en cuenta las siguientes limitaciones:
-
Número máximo de operaciones en una sola solicitud: puede especificar un máximo de 25 operaciones de colocación o eliminación en total; sin embargo, el tamaño total de la solicitud no puede ser mayor que 1 MB (la carga de HTTP).
-
Puede utilizar la operación
BatchWriteItem
únicamente para colocar y eliminar elementos. No la puede utilizar para actualizar los existentes. -
No es una operación atómica: las operaciones individuales especificadas en una operación
BatchWriteItem
son atómicas; sin embargo,BatchWriteItem
en su conjunto es una operación basada en el principio "en la medida en que sea posible", no es atómica. Es decir, en una solicitudBatchWriteItem
, algunas operaciones podrían realizarse correctamente y otras, no. Las operaciones que presentan algún error se devuelven en el campoUnprocessedItems
en la respuesta. Algunos de estos errores podrían deberse a que se haya superado el desempeño provisionado configurado para la tabla, o a un error transitorio de la red. Puede investigar y, si lo desea, reenviar las solicitudes. Normalmente, se llama aBatchWriteItem
en bucle, se comprueba en cada iteración si quedan elementos sin procesar y se envía una nueva solicitudBatchWriteItem
con esos elementos que faltan. -
No se devuelven elementos: la operación
BatchWriteItem
se ha diseñado para cargar grandes cantidades de datos de forma eficiente. No proporciona la sofisticación que ofrecenPutItem
yDeleteItem
. Por ejemplo,DeleteItem
es compatible con el campoReturnValues
del cuerpo de la solicitud para solicitar el elemento eliminado en la respuesta. En cambio, la operaciónBatchWriteItem
no devuelve ningún elemento de respuesta. -
A diferencia de
PutItem
yDeleteItem
,BatchWriteItem
no permite especificar condiciones para solicitudes de escritura individuales de la operación. -
Los valores de los atributos no pueden ser null; los atributos de tipo cadena y binario deben tener una longitud superior a cero; y los atributos de tipo conjunto no pueden estar vacíos. Las solicitudes con valores vacíos se rechazan con la excepción
ValidationException
.
DynamoDB rechaza toda la operación de escritura por lotes si se cumple cualquiera de las siguientes condiciones:
-
Si una o varias tablas especificados en la solicitud
BatchWriteItem
no existe. -
Si los atributos de clave principal especificados en un elemento de la solicitud no coinciden con el esquema de clave principal de la tabla correspondiente.
-
Si intenta realizar varias operaciones con el mismo elemento en la misma solicitud
BatchWriteItem
. Por ejemplo, no puede colocar y eliminar el mismo elemento en la misma solicitudBatchWriteItem
. -
Si el tamaño total de la solicitud supera el límite de tamaño de solicitud de 1 MB (la carga de HTTP).
-
Si cualquier elemento individual de un lote supera el límite de tamaño de elemento de 64 KB.
Solicitudes
Sintaxis
// This header is abbreviated. For a sample of a complete header, see API de bajo nivel de DynamoDB. POST / HTTP/1.1 x-amz-target: DynamoDB_20111205.BatchGetItem content-type: application/x-amz-json-1.0 { "RequestItems" : RequestItems } RequestItems { "
TableName1
" : [ Request, Request, ... ], "TableName2
" : [ Request, Request, ... ], ... } Request ::= PutRequest | DeleteRequest PutRequest ::= { "PutRequest" : { "Item" : { "Attribute-Name1
" : Attribute-Value, "Attribute-Name2
" : Attribute-Value, ... } } } DeleteRequest ::= { "DeleteRequest" : { "Key" : PrimaryKey-Value } } PrimaryKey-Value ::= HashTypePK | HashAndRangeTypePK HashTypePK ::= { "HashKeyElement" : Attribute-Value } HashAndRangeTypePK { "HashKeyElement" : Attribute-Value, "RangeKeyElement" : Attribute-Value, } Attribute-Value ::= String | Numeric| Binary | StringSet | NumericSet | BinarySet Numeric ::= { "N": "Number
" } String ::= { "S": "String
" } Binary ::= { "B": "Base64 encoded binary data
" } StringSet ::= { "SS": [ "String1
", "String2
", ... ] } NumberSet ::= { "NS": [ "Number1
", "Number2
", ... ] } BinarySet ::= { "BS": [ "Binary1
", "Binary2
", ... ] }
En el cuerpo de la solicitud, el objeto JSON RequestItems
describe las operaciones que desea a realizar. Las operaciones se agrupan por tablas. Puede utilizar BatchWriteItem
para actualizar o eliminar varios elementos en varias tablas. Para cada solicitud de escritura específica, debe identificar el tipo de solicitud (PutItem
o DeleteItem
), seguido de información detallada sobre la operación.
-
Para una solicitud
PutRequest
, se proporciona el elemento, es decir, una lista de atributos y sus valores. -
Para una solicitud
DeleteRequest
, se proporcionan el nombre y el valor de la clave principal.
Respuestas
Sintaxis
A continuación encontrará la sintaxis del cuerpo JSON devuelto en la respuesta.
{ "Responses" : ConsumedCapacityUnitsByTable "UnprocessedItems" : RequestItems } ConsumedCapacityUnitsByTable { "
TableName1
" : { "ConsumedCapacityUnits", :NumericValue
}, "TableName2
" : { "ConsumedCapacityUnits", :NumericValue
}, ... } RequestItems This syntax is identical to the one described in the JSON syntax in the request.
Errores especiales
No hay errores específicos de esta operación.
Ejemplos
En el siguiente ejemplo se muestra una solicitud HTTP POST y la respuesta de una operación BatchWriteItem
. En la solicitud se especifican las siguientes operaciones en las tablas Reply y Thread:
-
Colocar un elemento y eliminar un elemento de la tabla Reply
Colocar un elemento en la tabla Thread
Para obtener ejemplos sobre cómo usar el SDK de AWS, consulte Uso de elementos y atributos en DynamoDB.
Solicitud de ejemplo
// This header is abbreviated. For a sample of a complete header, see API de bajo nivel de DynamoDB. POST / HTTP/1.1 x-amz-target: DynamoDB_20111205.BatchGetItem content-type: application/x-amz-json-1.0 { "RequestItems":{ "Reply":[ { "PutRequest":{ "Item":{ "ReplyDateTime":{ "S":"2012-04-03T11:04:47.034Z" }, "Id":{ "S":"DynamoDB#DynamoDB Thread 5" } } } }, { "DeleteRequest":{ "Key":{ "HashKeyElement":{ "S":"DynamoDB#DynamoDB Thread 4" }, "RangeKeyElement":{ "S":"oops - accidental row" } } } } ], "Thread":[ { "PutRequest":{ "Item":{ "ForumName":{ "S":"DynamoDB" }, "Subject":{ "S":"DynamoDB Thread 5" } } } } ] } }
Respuesta de ejemplo
En la respuesta del siguiente ejemplo se muestra una operación de colocación que se ha realizado correctamente en las tablas Thread y Reply, y una operación que no se ha podido realizar en la tabla Reply (por ejemplo, porque se ha aplicado una limitación controlada por haberse superado el rendimiento aprovisionado de la tabla). Observe lo siguiente en la respuesta de JSON:
-
El objeto
Responses
muestra que se ha consumido una unidad de capacidad en cada tabla,Thread
yReply
, debido a sendas operaciones de colocación llevadas a cabo en ellas. -
El objeto
UnprocessedItems
muestra la operación de eliminación que no se pudo realizar en la tablaReply
. A continuación, puede emitir una nueva llamada aBatchWriteItem
para repetir estas solicitudes sin procesar.
HTTP/1.1 200 OK x-amzn-RequestId: G8M9ANLOE5QA26AEUHJKJE0ASBVV4KQNSO5AEMVJF66Q9ASUAAJG Content-Type: application/x-amz-json-1.0 Content-Length: 536 Date: Thu, 05 Apr 2012 18:22:09 GMT { "Responses":{ "Thread":{ "ConsumedCapacityUnits":1.0 }, "Reply":{ "ConsumedCapacityUnits":1.0 } }, "UnprocessedItems":{ "Reply":[ { "DeleteRequest":{ "Key":{ "HashKeyElement":{ "S":"DynamoDB#DynamoDB Thread 4" }, "RangeKeyElement":{ "S":"oops - accidental row" } } } } ] } }