全部產品
Search
文件中心

Tablestore:範圍讀取資料

更新時間:Jun 27, 2025

本文介紹如何通過 Java SDK 範圍讀取Table Store中的資料。

前提條件

初始化 Tablestore Client

方法說明

public GetRangeResponse getRange(GetRangeRequest getRangeRequest) throws TableStoreException, ClientException

GetRangeRequest參數說明

  • rangeRowQueryCriteria(必選)RangeRowQueryCriteria:範圍讀取資料資訊,包含以下參數。

    名稱

    類型

    說明

    tableName(必選)

    String

    資料表名稱。

    inclusiveStartPrimaryKey(必選)

    PrimaryKey

    起始主鍵資訊,包括主鍵列名稱和主索引值。

    • 返回資料包含起始主鍵。

    • 主鍵個數和類型必須與資料表的主鍵保持一致。

    • 正向讀取資料時,起始主鍵必須小於結束主鍵。

    • 反向讀取資料時,起始主鍵必須大於結束主鍵。

    • PrimaryKeyValue.INF_MIN 表示無限小,PrimaryKeyValue.INF_MAX 表示無限大。

    exclusiveEndPrimaryKey(必選)

    PrimaryKey

    結束主鍵資訊,包括主鍵列名稱和主索引值。

    • 返回資料不包含結束主鍵。

    • 主鍵個數和類型必須與資料表的主鍵保持一致。

    • PrimaryKeyValue.INF_MIN 表示無限小,PrimaryKeyValue.INF_MAX 表示無限大。

    direction(可選)

    Direction

    讀取方向。

    • FORWARD:預設值,正向讀取資料。

    • BACKWARD:反向讀取資料。

    maxVersions(可選)

    OptionalValue<Integer>

    最大版本數。

    • 必須設定最大版本數和版本範圍的其中一個。

    • 如果符合查詢條件的資料版本數量超過設定的最大版本數,按從新到舊的順序返回指定版本數量的資料。

    timeRange(可選)

    OptionalValue<TimeRange>

    資料版本範圍。

    • 必須設定最大版本數和版本範圍的其中一個。

    • Table Store資料表的每個屬性列可以有不同的資料版本,設定版本範圍後,僅返回版本範圍內的資料。

    limit(可選)

    int

    單次返回最大行數,必須大於 0。如果符合查詢條件的資料行數大於設定的值,將返回指定的最大行數和用於下一次查詢的起始主索引值。

    columnsToGet(可選)

    Set<String>

    指定讀取的資料列,可以是主鍵列或屬性列。

    • 不設定columnsToGet時,返回整行資料。

    • 設定columnsToGet時,如果讀取的行資料不包含任何指定的資料列,不返回該行資料。

    filter(可選)

    OptionalValue<Filter>

    過濾條件,詳情請參見過濾器

    • 如果同時設定columnsToGet和filter,先按columnsToGet篩選合格資料行,再按filter條件過濾資料。

範例程式碼

以下範例程式碼用於讀取 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);

相關文檔