查询时序数据

本文介绍如何通过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());
        });
    }

常见问题