通过 SDK 使用分析存储

使用 SDK 在已开启分析存储的时序模型实例下为时序表创建分析存储并为分析存储创建映射关系,然后使用 SQL 查询数据。

说明

您可以通过 Java SDK 或者 Go SDK 使用分析存储功能,本文以 Java SDK 为例介绍分析存储的使用。

注意事项

  • 时序分析存储功能从 2023 年 12 月 20 日正式开始收费。

  • 目前支持使用时序分析存储功能的地域有华东1(杭州)、华东2(上海)、华北2(北京)和华北3(张家口)。

  • 只支持在时序模型实例中使用分析存储功能。

如果在使用过程中遇到问题,请通过钉钉加入用户群 44327024(物联网存储 IoTstore 开发者交流群)联系我们。

准备工作

接口

接口

描述

CreateTimeseriesAnalyticalStore

创建一个分析存储。

UpdateTimeseriesAnalyticalStore

更新分析存储的数据生命周期。

DescribeTimeseriesAnalyticalStore

查询分析存储描述信息,例如分析存储配置信息、分析存储同步状态、分析存储大小等。

DeleteTimeseriesAnalyticalStore

删除一个分析存储。

步骤一:创建分析存储

为时序表创建分析存储后,您可以使用分析存储快速查询与分析时序数据。您可以在创建时序表时创建分析存储,也可以为已有时序表创建分析存储,请根据实际情况选择。

创建时序表时创建分析存储

创建时序表时支持创建默认分析存储或者创建自定义分析存储。

创建时序表时创建默认分析存储

以下示例用于创建test_timeseries_table时序表且该表中数据永不过期,同时创建一个默认分析存储。其中默认分析存储的名称固定为default_analytical_store,且默认分析存储内的数据永不过期。

private static void createTimeseriesTable(TimeseriesClient client) {
    String tableName = "test_timeseries_table";
    TimeseriesTableMeta timeseriesTableMeta = new TimeseriesTableMeta(tableName);
    int timeToLive = -1;
    timeseriesTableMeta.setTimeseriesTableOptions(new TimeseriesTableOptions(timeToLive));
    CreateTimeseriesTableRequest request = new CreateTimeseriesTableRequest(timeseriesTableMeta);
    
    client.createTimeseriesTable(request);
}

创建时序表时创建自定义分析存储

以下示例用于创建test_timeseries_table时序表且该表中数据永不过期,同时创建一个自定义分析存储。该自定义分析存储的名称为test_analytical_store,且自定义分析存储内的数据永不过期。

private static void createTimeseriesTable(TimeseriesClient client) {
    // 设置时序表名称和TTL。
    String tableName = "test_timeseries_table";
    TimeseriesTableMeta timeseriesTableMeta = new TimeseriesTableMeta(tableName);
    int timeToLive = -1;
    timeseriesTableMeta.setTimeseriesTableOptions(new TimeseriesTableOptions(timeToLive));
    CreateTimeseriesTableRequest request = new CreateTimeseriesTableRequest(timeseriesTableMeta);

    // 自定义分析存储。
    List<TimeseriesAnalyticalStore> analyticalStores = new ArrayList<TimeseriesAnalyticalStore>();
    analyticalStores.add(new TimeseriesAnalyticalStore("test_analytical_store"));
    request.setAnalyticalStores(analyticalStores);

    client.createTimeseriesTable(request);
}

为时序表创建分析存储后,您可以通过 SDK 批量写入数据到时序表。写入时序表的数据会同时写入分析存储中。具体操作,请参见写入时序数据

为已有时序表创建分析存储

以下示例用于为test_timeseries_table时序表创建一个分析存储。分析存储的名称为test_analytical_store,数据生命周期为30天(即2592000秒),同步选项为SYNC_TYPE_INCR。

public void createAnalyticalStore(TimeseriesClient client) {
    //设置分析存储名称。
    TimeseriesAnalyticalStore analyticalStore = new TimeseriesAnalyticalStore("test_analytical_store");
    //设置分析存储的数据生命周期。单位为秒。
    analyticalStore.setTimeToLive(2592000);
    //设置分析存储同步时序表中数据的方式。
    analyticalStore.setSyncOption(AnalyticalStoreSyncType.SYNC_TYPE_INCR);
    //设置时序表名称。
    CreateTimeseriesAnalyticalStoreRequest request = new CreateTimeseriesAnalyticalStoreRequest("test_timeseries_table", analyticalStore);
    client.createTimeseriesAnalyticalStore(request);
}

为时序表创建分析存储后,您可以通过 SDK 批量写入数据到时序表。写入时序表的数据会同时写入分析存储中。具体操作,请参见写入时序数据

步骤二:使用 SQL 查询数据

创建分析存储的映射关系后,使用 SELECT 语句查询与分析时序。

说明

关于 SQL 查询的更多信息,请参见 SQL 查询

  1. 创建分析存储的映射关系。

    示例如下:

    private static void createTable(SyncClient client) {
        // 创建SQL请求。
        SQLQueryRequest createTableRequest = new SQLQueryRequest("CREATE TABLE `device::cpu` " +
            "(`_m_name` VARCHAR(1024)," +
            " `_data_source` VARCHAR(1024)," +
            " `_tags` VARCHAR(1024)," +
            " `_time` BIGINT(20), " +
            " `usage_user` BIGINT(20), " +
            " `usage_system` BIGINT(20), " +
            " `usage_idle` BIGINT(20), " +
            " `usage_nice` BIGINT(20), " +
            " `usage_iowait` BIGINT(20), " +
            " `usage_irq` BIGINT(20), " +
            " `usage_softirq` BIGINT(20), " +
            " `usage_steal` BIGINT(20)," +
            " `usage_guest` BIGINT(20), " +
            " `usage_guest_nice` BIGINT(20)," +
            " `one_hour_stamp` BIGINT(20)," +
            " `one_minute_stamp` BIGINT(20)," +
            " PRIMARY KEY(`_m_name`,`_data_source`,`_tags`,`_time`)) ENGINE=AnalyticalStore;");
        // 获取SQL的响应结果。
        SQLQueryResponse response = client.sqlQuery(createTableRequest);
    }
  2. 查询数据。

    使用 SELECT 语句查询所需数据。更多示例请参见数据查询示例

    • 示例一:查询所有设备在 2023-01-05 05:14:002023-01-07 09:14:00 时间段内每天的最大 usage_irq 和最大 usage_softirq。

      private static void queryData(SyncClient client) {      
          SQLQueryRequest selectRequest = new SQLQueryRequest("SELECT time_bin(_time,\"1day\"), max(usage_irq),max(usage_softirq) " +
                  "FROM `device::cpu` " +
                  "WHERE _time > unix_timestamp_micros(\"2023-01-05 05:14:00.000000\") " +
                  "AND _time < unix_timestamp_micros(\"2023-01-07 09:14:00.000000\") " +
                  "GROUP BY 1 ORDER BY 1;");  //生成sql查询请求
          SQLQueryResponse selectResponse = client.sqlQuery(selectRequest); //执行SQL请求,获取查询请求应答。
          System.out.println("response type: " + selectResponse.getSQLStatementType());
          SQLTableMeta selectMeta = selectResponse.getSQLResultSet().getSQLTableMeta();//获取结果schema。
          System.out.println(selectMeta.getSchema());
          SQLResultSet selectResultSet = selectResponse.getSQLResultSet();//获取查询结果集。
          while (selectResultSet.hasNext()) {
              SQLRow row = selectResultSet.next();
              System.out.println(row.toDebugString());
              System.out.println(row.getDateTime(0).withZoneSameInstant(ZoneId.systemDefault()) + ", " + row.getLong(1) + ", " + row.getLong(2));
          } //打印结果。
      }
    • 示例二:查询在 host_50625 且 cpu 架构为 x64 的设备所有时间平均 usage_nice。

      private static void queryData(SyncClient client) {
          SQLQueryRequest selectRequest = new SQLQueryRequest("select avg(usage_nice) from `device::cpu` " +
                  "where _data_source = \"host_50625\" " +
                  "and tag_value_at(_tags,\"arch\") = \"x64\";");  //生成SQL查询请求。
          SQLQueryResponse selectResponse = client.sqlQuery(selectRequest); //执行SQL请求,获取查询请求应答。
          System.out.println("response type: " + selectResponse.getSQLStatementType());
          SQLTableMeta selectMeta = selectResponse.getSQLResultSet().getSQLTableMeta();//获取结果schema。
          System.out.println(selectMeta.getSchema());
          SQLResultSet selectResultSet = selectResponse.getSQLResultSet();//获取查询结果集。
          while (selectResultSet.hasNext()) {
      	      SQLRow row = selectResultSet.next();
              System.out.println(row.toDebugString());
              System.out.println(row.getDouble(0));
          }  //打印结果。
      }  

附录:管理分析存储

创建分析存储后,请根据需要执行相应操作。

查询分析存储描述信息

当需要查询分析存储的数据生命周期、分析存储同步阶段、分析存储数据量大小等详细信息时,您可以查询分析存储描述信息。

以下示例用于查询test_timeseries_table时序表下的test_analytical_store分析存储的描述信息。

public void describeAnalyticalStore(TimeseriesClient client) {
    //设置时序表名称和分析存储名称。
    DescribeTimeseriesAnalyticalStoreRequest request = new DescribeTimeseriesAnalyticalStoreRequest("test_timeseries_table", "test_analytical_store");
    DescribeTimeseriesAnalyticalStoreResponse response = client.describeTimeseriesAnalyticalStore(request);
    //打印分析存储名称。
    System.out.println("AnalyticalStoreName: " + response.getAnalyticalStore().getAnalyticalStoreName());
    //打印分析存储的数据生命周期,单位为秒。
    System.out.println("TimeToLive: " + response.getAnalyticalStore().getTimeToLive());
    //打印分析存储的同步选项。
    System.out.println("SyncOption: " + response.getAnalyticalStore().getSyncOption());
    //打印分析存储当前时间的同步阶段。
    if (response.getSyncStat() != null) {
        System.out.println("SyncPhase: " + response.getSyncStat().getSyncPhase());
        System.out.println("CurrentSyncTimestamp: " + response.getSyncStat().getCurrentSyncTimestamp());
    }
    //打印分析存储当前时间的存储量大小。
    if (response.getStorageSize() != null) {
        System.out.println("StorageSize: " + response.getStorageSize().getSizeInBytes());
        System.out.println("StorageSizeTimestamp: " + response.getStorageSize().getTimestamp());
    }
}

更新分析存储的生命周期

当需要清理分析存储中的历史数据时,您可以更新分析存储的数据生命周期 TTL。更新分析存储的 TTL 后,表格存储会自动异步删除分析存储中超过 TTL 的数据。

以下示例用于更新test_timeseries_table时序表下名为test_analytical_store分析存储的数据生命周期为30天(即2592000秒)。

public void updateAnalyticalStore(TimeseriesClient client) {
    //设置分析存储名称。
    TimeseriesAnalyticalStore store = new TimeseriesAnalyticalStore("test_analytical_store");
    //更新分析存储的数据生命周期为2592000秒。
    store.setTimeToLive(2592000);
    //设置时序表名称。
    UpdateTimeseriesAnalyticalStoreRequest request = new UpdateTimeseriesAnalyticalStoreRequest("test_timeseries_table");
    request.setAnalyticStore(store);
    client.updateTimeseriesAnalyticalStore(request);
}

删除分析存储

当不再需要使用分析存储来低成本菜存储时序数据以及查询与分析时序数据时,您可以删除分析存储。

以下示例用于删除test_timeseries_table时序表下的test_analytical_store分析存储并级联删除SQL映射表。

public void deleteAnalyticalStore(TimeseriesClient client) {
    //设置时序表名称和分析存储名称。
    DeleteTimeseriesAnalyticalStoreRequest request = new DeleteTimeseriesAnalyticalStoreRequest("test_timeseries_table", "test_analytical_store");
    request.setDropMappingTable(true);
    client.deleteTimeseriesAnalyticalStore(request);
}