BatchWriteItem - Amazon DynamoDB

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 solicitud BatchWriteItem, algunas operaciones podrían realizarse correctamente y otras, no. Las operaciones que presentan algún error se devuelven en el campo UnprocessedItems 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 a BatchWriteItem en bucle, se comprueba en cada iteración si quedan elementos sin procesar y se envía una nueva solicitud BatchWriteItem 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 ofrecen PutItem y DeleteItem. Por ejemplo, DeleteItem es compatible con el campo ReturnValues del cuerpo de la solicitud para solicitar el elemento eliminado en la respuesta. En cambio, la operación BatchWriteItem no devuelve ningún elemento de respuesta.

  • A diferencia de PutItem y DeleteItem, 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 solicitud BatchWriteItem.

  • 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 y Reply, 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 tabla Reply. A continuación, puede emitir una nueva llamada a BatchWriteItem 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" } } } } ] } }