文档

Lastpoint索引

更新时间:

Lastpoint索引提供了快速获取时间线最新时间点数据的能力。当需要获取每条时间线的最新一个时间点的时序数据时,您可以使用Lastpoint索引实现,您可以在创建时序表时创建Lastpoint索引,也可以为已存在的时序表创建Lastpoint索引。创建Lastpoint索引后,您可以使用GetRow、GetRange和BatchGetRow接口读取数据。

功能概述

Lastpoint索引专为快速检索时序表中各时间线的最新状态而设计,可用于快速获取监控目标的最新时间点数据。对于需要了解监控目标最新动态的业务场景,您可以通过创建Lastpoint索引来获取时间线的最新时间点数据,提升数据查询与分析效率。

创建Lastpoint索引后,当数据写入时序表时,表格存储会采用本地索引的方式将时序表中时间线的最新时间点数据自动同步到Lastpoint索引表中,当索引存量构建完成,进入增量状态后,不会有同步延迟。

数据同步到Lastpoint索引表后,Lastpoint索引表中会包括表格存储为时间线生成的分区键(即_#h字段)、时间线标识以及时间线的最新时间点数据。您可以通过数据读取接口(包括GetRowBatchGetRowGetRange)、SQL或多元索引查询Lastpoint索引表中的数据。

注意事项

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

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

be4365aa89c9377dd75d4b52b60d7144.jpg

使用方式

您可以通过表格存储控制台或者SDK使用Lastpoint索引功能。

进行Lastpoint索引操作前,您需要完成如下准备工作。

  • 使用阿里云账号或者使用具有表格存储操作权限的RAM用户进行操作。如果需要为RAM用户授权表格存储操作权限,请参见通过RAM Policy为RAM用户授权进行配置。

    使用SDK方式进行操作时,如果当前无可用AccessKey,您还需要为阿里云账号或者RAM用户创建AccessKey。具体操作,请参见创建AccessKey

  • 已创建时序模型实例。具体操作,请参见创建时序模型实例

    重要

    如果要使用Lastpoint索引功能,请在华东1(杭州)、华东2(上海)、华北2(北京)或者华北3(张家口)地域下创建时序模型实例。

使用控制台

  1. 创建Lastpoint索引。

    为时序表创建Lastpoint索引后,您可以使用Lastpoint索引快速获取时间线最新时间点的数据。您可以在创建时序表时创建Lastpoint索引,也可以为已有时序表创建Lastpoint索引,请根据实际需要进行选择。

    创建时序表时创建Lastpoint索引

    具体操作,请参见使用控制台

    为已有时序表创建Lastpoint索引

    1. 进入实例管理页面。

      1. 登录表格存储控制台

      2. 在页面上方,选择资源组和地域。

      3. 概览页面,单击实例名称或者单击实例操作实例管理

    2. 进入时序表管理页面。

      1. 实例管理页面,单击时序表列表页签。

      2. 时序表列表页签,单击时序表名或者单击时序表操作数据管理

    3. 创建LastPoint索引。

      1. 时序表管理页面的基本详情页签,单击创建Lastpoint索引

      2. 创建Lastpoint索引对话框,按照如下说明配置Lastpoint索引信息。

        参数

        描述

        Lastpoint索引名称

        • Lastpoint索引名称必须由字母、数字和下划线组成,且不能以数字开头。长度为1~128个字节。

        • Lastpoint索引表数量上限为10。

        同步方式

        • 全量同步,指扫描之前写入数据的最新时间点。

        • 增量同步,指更新后面写入数据的最新数据点。

  2. 写入时序数据到时序表。

    为时序表创建Lastpoint索引后,当写入时序数据到时序表时,表格存储会以异步方式将时序表中时间线最新时间点的数据自动同步到Lastpoint索引表中。具体操作,请参见写入时序数据

    假设时序表中的数据示例如下:

    _m_name

    _data_source

    _tags

    _time

    cpu_usage

    cpu_sys

    cpu

    host_1

    ["region=hangzhou"]

    1712476524000000

    10.0

    5.0

    cpu

    host_1

    ["region=hangzhou"]

    1712476525000000

    12.0

    5.0

    cpu

    host_1

    ["region=hangzhou"]

    1712476526000000

    14.0

    5.0

    cpu

    host_2

    ["region=hangzhou"]

    1712476524000000

    10.0

    5.0

    cpu

    host_2

    ["region=hangzhou"]

    1712476525000000

    20.0

    5.0

    cpu

    host_2

    ["region=hangzhou"]

    1712476526000000

    40.0

    5.0

    表格存储会自动同步时序表中时间线的最新时间点数据到Lastpoint索引表中。Lastpoint索引中的数据示例请参见下表。其中_#h字段为表格存储为时间线生成的分区键,_m_name_data_source_tags为时间线标识,时间线标识后的字段为时间线最新时间点的时序数据。

    _#h

    _m_name

    _data_source

    _tags

    cpu_usage

    cpu_sys

    03#cpu#a3

    cpu

    host_1

    ["region=hangzhou"]

    14.0

    5.0

    48#cpu#a5

    cpu

    host_2

    ["region=hangzhou"]

    40.0

    5.0

  3. 通过Lastpoint索引读取数据。

    创建Lastpoint索引后,您可以通过SQL查询的方式读取Lastpoint索引表中数据。具体操作如下:

    1. 为Lastpoint索引表创建SQL映射关系。更多信息,请参见创建表的映射关系

      1. 时序表管理页面,单击SQL查询页签。

      2. 在SQL查询控制台,输入创建SQL映射关系的SQL语句。配置示例如下:

        CREATE TABLE last_point_index(
          `_#h` VARCHAR(1024),
          `_m_name` VARCHAR(1024),
          `_data_source`  VARCHAR(1024),
          `_tags` VARCHAR(1024),
          cpu_usage DOUBLE,
          cpu_sys DOUBLE,
          PRIMARY KEY(`_#h`, `_m_name`,`_data_source`,`_tags`)
        )
      3. 单击执行SQL

    2. 使用SELECT语句查询数据。更多信息,请参见查询数据

      1. 在控制台输入SQL语句,单击执行SQL

        • 示例1:查询cpu_usage值超过90.0的时间线信息

          以下示例用于查询Lastpoint索引表last_point_index中cpu_usage值超过90.0的时间线信息。

          SELECT `_#h`,  `_m_name`, `_data_source`, `_tags` FROM last_point_index WHERE cpu_usage > 90.0;
        • 示例2:统计时间线的个数

          以下示例用于统计Lastpoint索引表last_point_index中的总行数。

          SELECT COUNT(*) AS total FROM last_point_index;

使用SDK

  1. 创建Lastpoint索引。

    为时序表创建Lastpoint索引后,您可以使用Lastpoint索引快速获取时间线最新时间点的数据。您可以在创建时序表时创建Lastpoint索引,也可以为已有时序表创建Lastpoint索引,请根据实际需要进行选择。

    创建时序表时创建Lastpoint索引

    以下示例用于创建时序表且该表中数据永不过期,同时创建一个Lastpoint索引。

    private static void createTimeseriesTable(TimeseriesClient client) {
        String tableName = "<TIMESERIES_TABLE_NAME>";
        TimeseriesTableMeta timeseriesTableMeta = new TimeseriesTableMeta(tableName);
        int timeToLive = -1;
        timeseriesTableMeta.setTimeseriesTableOptions(new TimeseriesTableOptions(timeToLive));
        CreateTimeseriesTableRequest request = new CreateTimeseriesTableRequest(timeseriesTableMeta);
        request.addLastpointIndex(new CreateTimeseriesTableRequest.LastpointIndex("<LASTPOINT_INDEX_NAME>"));
        client.createTimeseriesTable(request);
    }

    为已有时序表创建Lastpoint索引

    以下示例用于为时序表创建一个Lastpoint索引。

    public void createTimeseriesLastpointIndex(TimeseriesClient client) {
        CreateTimeseriesLastpointIndexRequest request =
                new CreateTimeseriesLastpointIndexRequest("<TIMESERIES_TABLE_NAME>", "<LASTPOINT_INDEX_NAME>", true);
        client.createTimeseriesLastpointIndex(request);
    }
  2. 写入时序数据到时序表。

    为时序表创建Lastpoint索引后,当写入时序数据到时序表时,表格存储会以异步方式将时序表中时间线最新时间点的数据自动同步到Lastpoint索引表中。具体操作,请参见写入时序数据

    假设时序表中的数据示例如下:

    _m_name

    _data_source

    _tags

    _time

    cpu_usage

    cpu_sys

    cpu

    host_1

    ["region=hangzhou"]

    1712476524000000

    10.0

    5.0

    cpu

    host_1

    ["region=hangzhou"]

    1712476525000000

    12.0

    5.0

    cpu

    host_1

    ["region=hangzhou"]

    1712476526000000

    14.0

    5.0

    cpu

    host_2

    ["region=hangzhou"]

    1712476524000000

    10.0

    5.0

    cpu

    host_2

    ["region=hangzhou"]

    1712476525000000

    20.0

    5.0

    cpu

    host_2

    ["region=hangzhou"]

    1712476526000000

    40.0

    5.0

    表格存储会自动同步时序表中时间线的最新时间点数据到Lastpoint索引表中。Lastpoint索引中的数据示例请参见下表。其中_#h字段为表格存储为时间线生成的分区键,_m_name_data_source_tags为时间线标识,时间线标识后的字段为时间线最新时间点的时序数据。

    _#h

    _m_name

    _data_source

    _tags

    cpu_usage

    cpu_sys

    03#cpu#a3

    cpu

    host_1

    ["region=hangzhou"]

    14.0

    5.0

    48#cpu#a5

    cpu

    host_2

    ["region=hangzhou"]

    40.0

    5.0

  3. 通过Lastpoint索引读取数据。

    创建Lastpoint索引后,您可以通过宽表数据读取接口、SQL查询或多元索引方式读取Lastpoint索引表中数据。

    通过宽表数据读取接口读取数据

    您可以通过GetRange接口扫描Lastpoint索引表中的数据。

    以下示例用于全表扫描Lastpoint索引表中的数据。

    private static void getRange(SyncClient client){
        // 设置Lastpoint索引表名称。
        RangeRowQueryCriteria rangeRowQueryCriteria = new RangeRowQueryCriteria("<LASTPOINT_INDEX_NAME>");
        // 构造起始主键和结束主键。起始主键均设置为INF_MIN,结束主键均设置为INF_MAX。
        PrimaryKeyBuilder startPrimaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
        startPrimaryKeyBuilder.addPrimaryKeyColumn("_#h", PrimaryKeyValue.INF_MIN);
        startPrimaryKeyBuilder.addPrimaryKeyColumn("_m_name", PrimaryKeyValue.INF_MIN);
        startPrimaryKeyBuilder.addPrimaryKeyColumn("_data_source", PrimaryKeyValue.INF_MIN);
        startPrimaryKeyBuilder.addPrimaryKeyColumn("_tags", PrimaryKeyValue.INF_MIN);
        rangeRowQueryCriteria.setInclusiveStartPrimaryKey(startPrimaryKeyBuilder.build());
        PrimaryKeyBuilder endPrimaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
        endPrimaryKeyBuilder.addPrimaryKeyColumn("_#h", PrimaryKeyValue.INF_MAX);
        endPrimaryKeyBuilder.addPrimaryKeyColumn("_m_name", PrimaryKeyValue.INF_MAX);
        endPrimaryKeyBuilder.addPrimaryKeyColumn("_data_source", PrimaryKeyValue.INF_MAX);
        endPrimaryKeyBuilder.addPrimaryKeyColumn("_tags", PrimaryKeyValue.INF_MAX);
        rangeRowQueryCriteria.setExclusiveEndPrimaryKey(endPrimaryKeyBuilder.build());
        
        rangeRowQueryCriteria.setMaxVersions(1);
        System.out.println("扫描索引表的结果为:");
        while (true) {
            GetRangeResponse getRangeResponse = client.getRange(new GetRangeRequest(rangeRowQueryCriteria));
            for (Row row : getRangeResponse.getRows()) {
                System.out.println(row);
            }
            // 如果nextStartPrimaryKey不为null,则继续读取数据。
            if (getRangeResponse.getNextStartPrimaryKey() != null) {
                rangeRowQueryCriteria.setInclusiveStartPrimaryKey(getRangeResponse.getNextStartPrimaryKey());
            } else {
                break;
            }
        }
    }

    通过SQL查询读取数据

    通过SQL查询读取Lastpoint索引表中的数据时,您需要先创建SQL映射关系,然后使用SELECT语句查询数据。具体操作如下:

    1. 为Lastpoint索引表创建SQL映射关系。更多信息,请参见创建表的映射关系

      配置示例如下:

      CREATE TABLE last_point_index(
        `_#h` VARCHAR(1024),
        `_m_name` VARCHAR(1024),
        `_data_source`  VARCHAR(1024),
        `_tags` VARCHAR(1024),
        cpu_usage DOUBLE,
        cpu_sys DOUBLE,
        PRIMARY KEY(`_#h`, `_m_name`,`_data_source`,`_tags`)
      )
    2. 使用SELECT语句查询数据。更多信息,请参见查询数据

      • 示例1:查询cpu_usage值超过90.0的时间线信息

        以下示例用于查询Lastpoint索引表last_point_index中cpu_usage值超过90.0的时间线信息。

        SELECT `_#h`,  `_m_name`, `_data_source`, `_tags` FROM last_point_index WHERE cpu_usage > 90.0;
      • 示例2:统计时间线的个数

        以下示例用于统计Lastpoint索引表last_point_index中的总行数。

        SELECT COUNT(*) AS total FROM last_point_index;

    通过多元索引读取数据

    对于时间线比较多的场景,您可以通过多元索引读取Lastpoint索引表中的数据。

    通过多元索引读取Lastpoint索引表中的数据时,您需要先为Lastpoint索引表创建多元索引,然后使用多元索引查询功能查询数据。具体操作如下:

    1. 为Lastpoint索引表创建多元索引。

      以下示例用于为Lastpoint索引表创建一个多元索引。

      重要

      示例中_tags列为标签构成的字符串数组,建议将对应的多元索引字段类型设置为Keyword数组,以便更加方便地对_tags内的标签进行查询。

      private static void createSearchIndex(SyncClient client) {
          CreateSearchIndexRequest createSearchIndexRequest = new CreateSearchIndexRequest();
          createSearchIndexRequest.setTableName("last_point_index");
          createSearchIndexRequest.setIndexName("last_point_search_index");
          IndexSchema indexSchema = new IndexSchema();
          indexSchema.setFieldSchemas(Arrays.asList(
                  new FieldSchema("_#h", FieldType.KEYWORD).setIndex(true).setEnableSortAndAgg(true),
                  new FieldSchema("_m_name", FieldType.KEYWORD).setIndex(true).setEnableSortAndAgg(true),
                  new FieldSchema("_data_source", FieldType.KEYWORD).setIndex(true).setEnableSortAndAgg(true),
                  new FieldSchema("_tags", FieldType.KEYWORD).setIndex(true).setEnableSortAndAgg(true).setIsArray(true),
                  new FieldSchema("cpu_usage", FieldType.DOUBLE).setIndex(true).setEnableSortAndAgg(true),
                  new FieldSchema("cpu_sys", FieldType.DOUBLE).setIndex(true).setEnableSortAndAgg(true)
          ));
          createSearchIndexRequest.setIndexSchema(indexSchema);
          client.createSearchIndex(createSearchIndexRequest);
      }
    2. 通过多元索引的查询功能进行数据查询。更多信息,请参见多元索引数据查询

      此处以范围查询为例介绍多元索引查询功能使用。

      以下示例用于通过取Lastpoint索引表对应多元索引last_point_search_index读取cpu_usage值大于90.0的行数据。

      private static void rangeQuery(SyncClient client) {
          SearchQuery searchQuery = new SearchQuery();
          RangeQuery rangeQuery = new RangeQuery(); //设置查询类型为RangeQuery。
          rangeQuery.setFieldName("cpu_usage");  //设置要匹配的字段。
          rangeQuery.greaterThan(ColumnValue.fromDouble(90.0));  //设置该字段的范围条件为大于90.0。
          searchQuery.setGetTotalCount(true);
          searchQuery.setQuery(rangeQuery);
          //设置按照Col_Long列逆序排序。
          FieldSort fieldSort = new FieldSort("cpu_usage");
          fieldSort.setOrder(SortOrder.DESC);
          searchQuery.setSort(new Sort(Arrays.asList((Sort.Sorter)fieldSort)));
          //searchQuery.setGetTotalCount(true); //设置返回匹配的总行数。
      
          SearchRequest searchRequest = new SearchRequest("last_point_index", "last_point_search_index", searchQuery);
          //通过设置columnsToGet参数可以指定返回的列或返回所有列,如果不设置此参数,则默认只返回主键列。
          //SearchRequest.ColumnsToGet columnsToGet = new SearchRequest.ColumnsToGet();
          //columnsToGet.setReturnAll(true); //设置为返回所有列。
          //columnsToGet.setColumns(Arrays.asList("ColName1","ColName2")); //设置为返回指定列。
          //searchRequest.setColumnsToGet(columnsToGet);
      
          SearchResponse resp = client.search(searchRequest);
          //System.out.println("TotalCount: " + resp.getTotalCount()); //打印匹配到的总行数,非返回行数。
          System.out.println("Row: " + resp.getRows());
      }

计费说明

构建Lastpoint索引过程中不会产生费用,Lastpoint索引的数据存储和索引中数据的读取会产生费用。更多信息,请参见时序模型计量计费

如果使用了SQL查询或多元索引功能查询Lastpoint索引中的数据,则还会产生SQL查询和多元索引相关费用,产生的费用按照相应功能的使用规则计费。更多信息,请参见SQL查询计量计费多元索引计量计费