1.5.7 允许部分执行的批量操作
BatchResult partialAllowedBatch(BatchRequest request)
功能
一般的batch请求,当表quota不足时会全部拒绝;而partialAllowedBatch允许在quota满足的范围内,部分记录可以执行, 通过返回值告知用户哪些记录执行成功,哪些记录没有执行, 若当前quota不满足甚至1条记录执行,会抛出THROUGHPUT_EXCEED异常; 用户需要检查返回值,把没有执行的记录循环地发请求,直到所有记录都成功执行为止。
方法参数
request : BatchRequest : required
BatchRequest 包括一个可以为PutRequest, RemoveRequest, GetRequest, IncrementRequest的列表
1.items : List< BatchRequestItem > : required
BatchRequestItem包括BatchOp和Request
枚举类型BatchOp(PUT, GET, REMOVE, INCREMENT)指定该request的操作类型,
相应的,使用putRequest,getRequest, removeRequest,incrementRequest构造Request参数
方法返回值
batchResult : BatchResult
BatchResult 包括一个带有BatchResultItem的列表,表示batch的每个请求的执行结果
items : List< BatchResultItem >
返回每个子操作的结果,其中isSuccess==true表示已经执行,isSuccess==false表示没有执行
限制
每个子操作必须是同一个表的
put,remove请求不支持带条件
batch操作的子操作数范围为[ 1, 100 ]
示例
下面示例代码
List<BatchRequestItem> batch = new ArrayList<BatchRequestItem>();
for (int i = 11; i < 20; i++) {
BatchRequestItem item = new BatchRequestItem().setAction(BatchOp.PUT);
Map<String, Datum> record = new HashMap<String, Datum>();
record.put("cityId", DatumUtil.toDatum(cities[i]));
putRequest.putToRecord("timestamp", DatumUtil.toDatum(now.getTime()));
putRequest.putToRecord("score", DatumUtil.toDatum((double) new Random().nextInt(100)));
putRequest.putToRecord("pm25", DatumUtil.toDatum((long) (new Random().nextInt(500))));
item.setRequest(Request.putRequest(new PutRequest().setTableName(tableName).setRecord(record)));
batch.add(item);
}
while (true) {
BatchResult br = tableClient.partialAllowedBatch(new BatchRequest().setItems(batch));
List<BatchRequestItem> request = new ArrayList<BatchRequestItem>();
for (int i = 0; i < br.getItems().size(); i++) {
//At current only quota exceeded will get isSuccess() == false
if (!br.getItems().get(i).isSuccess()) {
request.add(batch.get(i));
}
}
if (request.isEmpty()) {
break;
}
Thread.sleep(100); // wait a while to retry.
batch = request;
}