BatchWriteItem
重要
本节介绍已经弃用的 API 版本 2011-12-05,不应用于新应用程序。
有关当前低级别 API 的文档,请参阅 Amazon DynamoDB API 参考。
描述
此操作可以在一次调用中,放入或删除多个表中的多个项目。
要上传项目,可以使用 PutItem
,要删除项目,可以使用 DeleteItem
。但是,如果要上传或删除大量数据(例如从 Amazon EMR (Amazon EMR) 上传大量数据,或将数据从其他数据库迁移到 DynamoDB),BatchWriteItem
是一个高效选择。
如果使用 Java 等语言,可以利用线程并行上传项目。这增加了应用程序处理线程的复杂性。其他语言不支持线程。例如,如果使用 PHP,则必须一次上传或删除一个项目。在这两种情况下,BatchWriteItem
可以并行处理指定的放入和删除操作,具有线程池方法的优势,同时不必增加应用程序的复杂性。
请注意,BatchWriteItem
操作中指定的每个放入和删除在消耗容量单位方面的消耗相同。但是,由于 BatchWriteItem
并行执行指定操作,延迟更低。对不存在的项目执行的删除操作消耗 1 个写入容量单位。有关消耗容量单位的更多信息,请参阅 使用 DynamoDB 中的表和数据。
使用 BatchWriteItem
时请注意以下限制:
-
单个请求中的最大操作数 — 您最多可以指定 25 个放入或删除操作;但是,请求总大小不能超过 1 MB(HTTP 负载)。
-
您只能使用
BatchWriteItem
操作放入和删除项目,不能用来更新现有项目。 -
不是原子操作 -
BatchWriteItem
中指定的每个操作是原子操作;但是BatchWriteItem
整体是“尽最大努力”的操作,而不是原子操作。也就是说,在BatchWriteItem
请求中,有些操作可能成功,有些操作可能失败。失败的操作将在响应的UnprocessedItems
字段返回。其中一些失败可能是因为超过为表配置的预置吞吐量,或者出现暂时故障,如网络错误。您可以分析,选择重新发送请求。通常,在循环中调用BatchWriteItem
,在每个迭代中检查未处理的项目,对没有处理的项目提交新的BatchWriteItem
请求。 -
不返回任何项目 —
BatchWriteItem
设计用于高效上传大量数据,不具备PutItem
和DeleteItem
的一些精密性。例如,DeleteItem
支持在请求体中用ReturnValues
字段请求响应中的已删除项目。BatchWriteItem
操作在响应中不返回任何项目。 -
不像
PutItem
和DeleteItem
,BatchWriteItem
不允许为操作中的单个写入请求指定条件。 -
属性值不得为空;字符串和二进制类型属性的长度必须大于零;设置类型属性不得为空。具有空值的请求将被拒绝,并显示
ValidationException
。
如果满足以下任一条件,DynamoDB 将拒绝整个批处理写入操作:
-
如果
BatchWriteItem
请求中指定的一个或多个表不存在。 -
如果在求中的项目上指定的主键属性与相应表的主键架构不匹配。
-
如果尝试在同一个
BatchWriteItem
请求中对同一项目执行多个操作。例如,不能在同一个BatchWriteItem
请求中放入和删除同一项目。 -
如果总请求大小超过 1 MB(HTTP 有效负载)限制。
-
如果批处理中的任何单个项目超过 64 KB 项目大小限制。
请求
语法
// This header is abbreviated. For a sample of a complete header, see DynamoDB 低级 API. 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
", ... ] }
在请求体中,RequestItems
JSON 对象说明要执行的操作。操作按表分组。可以使用 BatchWriteItem
更新或删除多个表中的多个项目。对于每个特定写入请求,必须确定请求类型(PutItem
、DeleteItem
),以及操作的详细信息。
-
对于
PutRequest
,提供的项目是属性及其值的列表。 -
对于
DeleteRequest
,提供主键名称和值。
响应
语法
响应中返回的 JSON 正文的语法如下。
{ "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.
特殊错误
没有特定于此操作的错误。
示例
下面的示例显示 HTTP POST 请求和 BatchWriteItem
操作的响应。请求指定对回复和线程表执行以下操作:
-
在回复表中放入一个项目并删除一个项目
将线程表中放入一个项目
有关使用 AWS SDK 的示例,请参阅 使用 DynamoDB 中的项目和属性。
示例请求
// This header is abbreviated. For a sample of a complete header, see DynamoDB 低级 API. 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" } } } } ] } }
示例响应
下面的示例响应显示对线程和回复表执行的放入操作成功,对回复表执行的删除操作失败(原因是超出表的预置吞吐量,导致节流)。注意 JSON 响应的以下内容:
-
Responses
对象显示由于在Thread
和Reply
表的放入操作成功,这两个表各消耗一个容量单位。 -
UnprocessedItems
对象显示Reply
表上删除操作失败。可以发出一个新的BatchWriteItem
调用来处理这些未处理的请求。
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" } } } } ] } }