本文介绍如何通过 Java SDK 范围读取表格存储中的数据。
前提条件
方法说明
public GetRangeResponse getRange(GetRangeRequest getRangeRequest) throws TableStoreException, ClientException
示例代码
以下示例代码用于读取 test_table 表中主键值大于 row1 的数据。
public static void getRangeExample(SyncClient client) {
// 构造查询条件
RangeRowQueryCriteria rangeRowQueryCriteria = new RangeRowQueryCriteria("test_table");
// 设置查询起始主键
PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
primaryKeyBuilder.addPrimaryKeyColumn("id", PrimaryKeyValue.fromString("row1"));
rangeRowQueryCriteria.setInclusiveStartPrimaryKey(primaryKeyBuilder.build());
// 设置查询结束主键,返回结果不包含结束主键
primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
primaryKeyBuilder.addPrimaryKeyColumn("id", PrimaryKeyValue.INF_MAX);
rangeRowQueryCriteria.setExclusiveEndPrimaryKey(primaryKeyBuilder.build());
// 设置查询版本
rangeRowQueryCriteria.setMaxVersions(1);
// 调用 getRange 方法查询数据
GetRangeRequest getRangeRequest = new GetRangeRequest(rangeRowQueryCriteria);
GetRangeResponse getRangeResponse = client.getRange(getRangeRequest);
// 返回结果处理
System.out.println("RequestId: " + getRangeResponse.getRequestId());
System.out.println("Read CU Cost: " + getRangeResponse.getConsumedCapacity().getCapacityUnit().getReadCapacityUnit());
System.out.println("Write CU Cost: " + getRangeResponse.getConsumedCapacity().getCapacityUnit().getWriteCapacityUnit());
for(Row row : getRangeResponse.getRows())
System.out.println(row);
}
单次范围扫描数据上限为 5000 行或者 4 MB,超出限制部分的数据将返回用于下一次读取的起始主键值,您可以参考以下代码进行迭代查询。
while(true) {
GetRangeRequest getRangeRequest = new GetRangeRequest(rangeRowQueryCriteria);
GetRangeResponse getRangeResponse = client.getRange(getRangeRequest);
// 返回结果处理
System.out.println("RequestId: " + getRangeResponse.getRequestId());
System.out.println("Read CU Cost: " + getRangeResponse.getConsumedCapacity().getCapacityUnit().getReadCapacityUnit());
System.out.println("Write CU Cost: " + getRangeResponse.getConsumedCapacity().getCapacityUnit().getWriteCapacityUnit());
for(Row row : getRangeResponse.getRows())
System.out.println(row);
System.out.println("Rows Count: " + getRangeResponse.getRows().size());
// 设置下一次读取数据起始主键
if(getRangeResponse.getNextStartPrimaryKey() != null)
rangeRowQueryCriteria.setInclusiveStartPrimaryKey(getRangeResponse.getNextStartPrimaryKey());
else break;
}
您也可以在查询数据时参考示例代码进行以下设置。
设置数据读取方向。
// 设置反向读取数据 rangeRowQueryCriteria.setDirection(Direction.BACKWARD); // 设置查询起始主键,反向读取数据时,起始主键要大于结束主键 PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder(); primaryKeyBuilder.addPrimaryKeyColumn("id", PrimaryKeyValue.INF_MAX); rangeRowQueryCriteria.setInclusiveStartPrimaryKey(primaryKeyBuilder.build()); // 设置查询结束主键,返回结果不包含结束主键 primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder(); primaryKeyBuilder.addPrimaryKeyColumn("id", PrimaryKeyValue.fromString("row1")); rangeRowQueryCriteria.setExclusiveEndPrimaryKey(primaryKeyBuilder.build());
设置读取的数据版本范围,结果只返回版本范围内的数据。
// 设置查询的数据版本范围为当前时间往前一天 rangeRowQueryCriteria.setTimeRange(new TimeRange(System.currentTimeMillis() - 86400*1000, System.currentTimeMillis()));
指定读取的属性列。
rangeRowQueryCriteria.addColumnsToGet("col2");
设置单次返回最大行数。
rangeRowQueryCriteria.setLimit(10);
相关文档
该文章对您有帮助吗?