说说前段时间做表格存储Tablestorep,遇到批量查询和批量更新的问题,下面直接上程序源码。
@Autowired
private SyncClient syncClient;
/**
* @param source 修改值
* @param target 查询值
* Tablestorep实现批量更新
*/
@Override
public void updateRowWithCondition(Long source, Long target) {
log.warn("批量修改入参{},{}",source,target);
// 根据查询条件批量查询数据
List<PrimaryKey> termQueryStyleId = getTermQueryStyleId(target);
BatchWriteRowRequest batchWriteRowRequest = new BatchWriteRowRequest();
RowUpdateChange rowUpdateChange = null;
try {
for (int i = 0; i < termQueryStyleId.size(); i++) {
rowUpdateChange = new RowUpdateChange(storeProperties.getPostionTableName(), termQueryStyleId.get(i));
rowUpdateChange.put(new Column("mechanicsStyleId", ColumnValue.fromLong(source)));
batchWriteRowRequest.addRowChange(rowUpdateChange);
//api 目前批量更新每次最多只能支持200条数据
if (i % 200 == 0 || i == termQueryStyleId.size() - 1) {
BatchWriteRowResponse response = syncClient.batchWriteRow(batchWriteRowRequest);
// 提交完成重新创建一个新的容器存储新的数据
batchWriteRowRequest = new BatchWriteRowRequest();
log.warn(i + "是否全部成功{}",response.isAllSucceed());
}
}
} catch (TableStoreException ex) {
log.warn("批量修改出现异常{}",ex);
}
}
/**
* 根据条件精准查询,不带分页查询
* @param target 查询添加
* @param
*/
private List<PrimaryKey> getTermQueryStyleId(Long target) {
//获取sessionId和本次请求支持的最大并发数。
ComputeSplitsRequest computeSplitsRequest = new ComputeSplitsRequest();
// 区域数据表格名称
computeSplitsRequest.setTableName(storeProperties.getPostionTableName());
// 区域数据统计索引
computeSplitsRequest.setSplitsOptions(new SearchIndexSplitsOptions(storeProperties.getPostionTableCountIndex()));
ComputeSplitsResponse computeSplitsResponse = syncClient.computeSplits(computeSplitsRequest);
byte[] sessionId = computeSplitsResponse.getSessionId();
int splitsSize = computeSplitsResponse.getSplitsSize();
log.info("历史记录本次请求支持的最大并发数:{}", splitsSize);
// 设置查询添加
MatchQuery mechanicsQuery = new MatchQuery();
mechanicsQuery.setFieldName("mechanicsStyleId");
mechanicsQuery.setText(target + "");
BoolQuery boolQuery = new BoolQuery();
boolQuery.setMustQueries(Arrays.asList(mechanicsQuery));
/*
* 使用builder模式创建并发扫描数据请求,功能与前面一致。
*/
ParallelScanRequest parallelScanRequestByBuilder = ParallelScanRequest.newBuilder()
.tableName(storeProperties.getPostionTableName())
.indexName(storeProperties.getPostionTableCountIndex())
.scanQuery(ScanQuery.newBuilder()
.query(boolQuery)
.limit(2000)
.build())
.addColumnsToGet("id")
.sessionId(sessionId)
.build();
List<PrimaryKey> result = new ArrayList<>();
// 不设置返回字段默认只返回主键id
RowIterator iterator = syncClient.createParallelScanIterator(parallelScanRequestByBuilder);
while (iterator.hasNext()) {
Row row = iterator.next();
PrimaryKey primaryKey = row.getPrimaryKey();
result.add(primaryKey);
}
return result;
}
作者声明:本篇经验系本人依照真实经历原创,未经许可,谢绝转载。