本文介紹如何通過 Java SDK 範圍讀取Table Store中的資料。
前提條件
方法說明
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);