全部產品
Search
文件中心

Tablestore:查詢時序資料

更新時間:May 08, 2025

本文介紹如何通過Java SDK查詢時序表中符合指定條件的時序資料。

前提條件

初始化Tablestore Client

方法說明

public GetTimeseriesDataResponse getTimeseriesData(GetTimeseriesDataRequest request) throws TableStoreException, ClientException

GetTimeseriesDataRequest參數說明

  • timeseriesTableName(必選)String:時序表名稱。

  • timeseriesKey(必選)TimeseriesKey:時間軸標識,包含以下參數。

    名稱

    類型

    說明

    measurementName(必選)

    String

    時間軸的度量名稱。

    dataSource(必選)

    String

    時間軸的資料來源資訊。

    tags(必選)

    SortedMap<String, String>

    時間軸的標籤資訊,由多個索引值對(key-value)組成。

  • beginTimeInUs(必選)long:起始時間戳記。單位為微秒,取值必須大於等於0。

    • 查詢條件包含起始時間戳記。

  • endTimeInUs(必選)long:結束時間戳記。單位為微秒,取值必須大於0。

    • 查詢條件不包含結束時間戳記。

  • limit(可選)int:單次請求的最大返回行數。預設值為5000,取值範圍為(0,5000]

    • 即使合格資料行數超過限制,由於掃描資料量等因素的影響,單次請求所返回的資料行數仍可能低於限制條數。您可以通過nextToken繼續擷取剩餘資料。

  • nextToken(可選)byte[]:分頁查詢憑證,用於擷取下一頁資料。預設值為空白。

    • 首次請求,需將nextToken設定為空白。如果一次請求未返回全部合格資料,則返回結果中的nextToken參數值不為空白,您可使用nextToken進行翻頁查詢。

    • 如果需要對nextToken進行持久化或將其傳輸至前端頁面,建議使用Base64編碼將nextToken編碼為字串後進行儲存或傳輸。nextToken本身並不是字串,如果直接使用new String(nextToken)進行編碼,將導致token資訊的丟失。

  • backward(可選)boolean:是否按照時間倒序讀取資料,預設值為false。

  • fieldsToGet(可選)List<Pair<String, ColumnType>>:指定查詢的資料列,不指定則預設查詢所有列。

    • fieldsToGet中,必須明確指定要擷取的每一列的列名及其資料類型。如果資料類型與實際不符,則將無法讀取該列的資料。

範例程式碼

以下範例程式碼查詢timeseries_table_sample時序表中合格時序資料。

private static void getTimeseriesData(TimeseriesClient client) {
    String tableName = "timeseries_table_sample";
    GetTimeseriesDataRequest getTimeseriesDataRequest = new GetTimeseriesDataRequest(tableName);
    
    // 指定時間軸標識。度量名稱為cpu,資料來源標識為host_0,且標籤為"region=hangzhou"和"os=Ubuntu16.04"。
    Map<String, String> tags = new HashMap<String, String>();
    tags.put("region", "hangzhou");
    tags.put("os", "Ubuntu16.04");
    TimeseriesKey timeseriesKey = new TimeseriesKey("cpu", "host_0", tags);
    getTimeseriesDataRequest.setTimeseriesKey(timeseriesKey);
    
    // 指定時間範圍。
    getTimeseriesDataRequest.setTimeRange(0, (System.currentTimeMillis() + 60 * 1000) * 1000);
    getTimeseriesDataRequest.setLimit(20);
    
    // 查詢時序資料。
    GetTimeseriesDataResponse getTimeseriesDataResponse = client.getTimeseriesData(getTimeseriesDataRequest);
    // 列印查詢結果。
    getTimeseriesDataResponse.getRows().forEach(row -> {
        System.out.println("TimeseriesKey: " + row.getTimeseriesKey() + "; TimeInUs: " + row.getTimeInUs() + "; Fields: " + row.getFields());
    });
}

您也可以在查詢時序資料的同時參考範例程式碼進行以下設定。

  • 設定單次請求的最大返回行數

    getTimeseriesDataRequest.setLimit(20);
  • 設定按倒序進行排序

    // 按照時間倒序讀取資料,以便擷取某條時間軸的最新資料。
    getTimeseriesDataRequest.setBackward(true);
  • 指定返回結果中要擷取的部分資料列

     getTimeseriesDataRequest.addFieldToGet("col_string", ColumnType.STRING);
     getTimeseriesDataRequest.addFieldToGet("col_long", ColumnType.INTEGER);
     getTimeseriesDataRequest.addFieldToGet("col_double", ColumnType.DOUBLE);
  • 通過nextToken進行翻頁查詢

    // 如果nextToken不為空白,可以發起下一次請求。
    if (getTimeseriesDataResponse.getNextToken() != null) {
        // 擷取nextToken。
        byte[] nextToken = getTimeseriesDataResponse.getNextToken();
        
        /*
        // 如果需要持久化nextToken或者傳輸nextToken給前端頁面,您可以使用Base64編碼將nextToken編碼為String進行儲存和傳輸。
        String tokenAsString = Base64.toBase64String(nextToken);
        // 將String重新解碼為byte類型的nextToken。
        byte[] tokenAsByte = Base64.fromBase64String(tokenAsString);
        */
        
        // 指定nextToken。
        getTimeseriesDataRequest.setNextToken(nextToken);
        // 查詢時序資料。
        getTimeseriesDataResponse = client.getTimeseriesData(getTimeseriesDataRequest);
        // 列印查詢結果。
        getTimeseriesDataResponse.getRows().forEach(row -> {
            System.out.println("TimeseriesKey: " + row.getTimeseriesKey() + "; TimeInUs: " + row.getTimeInUs() + "; Fields: " + row.getFields());
        });
    }

常見問題