自定义时间线标识和作为主键的数据字段

重要

本文中含有需要您注意的重要提示信息,忽略该信息可能对您的业务造成影响,请务必仔细阅读。

时序模型的时间线标识默认由度量名称、数据源和标签组成,您可以通过自定义时间线标识实现按照业务实际需要定义时间线标识。时序表中通过时间线标识和时间点来唯一确定一行时序数据,您可以通过为时间线添加作为主键的数据字段实现保存两行时间线标识和时间点相同但时序数据不同的行数据。本文介绍如何自定义时间线标识和作为主键的数据字段。

注意事项

  • 支持自定义时间线标识和配置作为主键的数据字段功能的地域包括华东1(杭州)、华东2(上海)、华北2(北京)和华北3(张家口)。

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

使用场景

自定义时间线标识

自定义时间线标识的使用场景主要集中在需要对数据进行精确时间定位、区间查询、趋势分析和事件关联的领域,以下是一些具体的使用案例:

  • 故障排查与根本原因分析。

    在 IT 运维和工业设备监控中,自定义时间线标识能够帮助精确标记故障发生的时间点,结合其他时序数据(如设备状态、日志信息),快速定位问题原因,进行根本原因分析。

  • 用户行为分析。

    在互联网应用中,通过记录用户的登录时间、页面浏览时间、操作序列等,自定义时间线标识可以用来分析用户活跃时段、会话时长、行为路径,进而优化用户体验、个性化推荐内容。

  • 金融交易审计。

    在金融领域,每一笔交易都需要精确的时间戳记录,自定义时间线标识不仅用于确保交易的顺序性和完整性,还用于反欺诈分析,如识别异常交易模式、追踪资金流。

通过自定义时间线标识,可以灵活地对时序数据进行分组、筛选和分析,满足不同业务场景下对时序数据的精细管理与洞察需求。

时序表数据示例

在监控工业设备的温度和湿度的场景下,时序表参见下表:

  • measurement、data_source、area 和 _tags 作为自定义时间线标识的字段,分别为度量名称、数据源、区域和标签。

  • _time,为时间点。

  • temperature、humidity,为温度和湿度。

measurement

data_source

region

_tags

_time

temperature

humidity

temperature

sensorA001

production

["sensor_type=typeA",

"sensor_version=1.0"]

1712476514000000

24.5

temperature

sensorA002

production

["sensor_type=typeA",

"sensor_version=1.0"]

1712476524000000

24.5

temperature

sensorA002

maintenance

["sensor_type=typeA",

"sensor_version=1.1"]

1712476534000000

23.0

humidity

sensorB001

production

["sensor_type=typeB",

"sensor_version=1.0"]

1712476514000000

0.55

humidity

sensorB001

maintenance

["sensor_type=typeB",

"sensor_version=1.0"]

1712476524000000

0.50

配置作为主键的数据字段

当实际业务中存在时间线标识和时间点相同但是时序数据不同的数据存储需求时,您可以通过为时序表添加作为主键的数据字段来实现。以下是一些具体的使用场景:

  • 事件关联分析。

    在某些复杂的分析场景中,可能需要根据时间线标识以外的数据字段来关联时序数据。添加作为主键的数据字段可以快速定位到特定设备在特定时间点的数据,适用于故障排查、行为分析等。

  • 多维度索引。

    在时序数据库的高级应用中,如需对数据进行多维度查询和过滤,添加作为主键的数据字段可以加速查询效率,特别是在处理海量数据时,能够更精确地定位到感兴趣的时序数据。

  • 多租户时序数据管理。

    在为多个客户提供时序数据存储服务时,可能需要在时序数据表中加入租户 ID 作为其中一个主键,与时间戳一起构成复合主键,确保不同租户的数据隔离和高效访问。

时序表数据示例

监控服务器 CPU 的利用情况时要使用时间线标识定位每台服务器,但是每台服务器有多个核心,此时将核心编号 processor 添加为作为主键的数据字段。时序表参见下表:

  • _m_name、_data_source 和 tags 作为自定义时间线标识的字段,分别为度量名称、数据源和标签。

  • _time,为时间点。

  • processor,为服务器的核心,是一个作为主键的数据字段。

  • cpu_usage,为 cpu 使用率。

_m_name

_data_source

_tags

_time

processor

cpu_usage

cpu

host_1

["region=hangzhou"]

1712476524000000

0

10.0

cpu

host_1

["region=hangzhou"]

1712476524000000

1

10.0

cpu

host_1

["region=hangzhou"]

1712476524000000

2

10.0

使用方式

您可以通过表格存储控制台或者 SDK 自定义时间线标识和作为主键的数据字段。

进行自定义时间线标识和作为主键的数据字段操作前,您需要完成如下准备工作。

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

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

    警告

    阿里云账号的 AccessKey 泄露会威胁该账号下所有资源的安全。为保证账号安全,强烈建议您使用 RAM 用户创建的 AccessKey,不要创建并使用阿里云账号的 AccessKey。

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

    重要

    如果要使用自定义时间线标识或作为主键的数据字段功能,请在华东1(杭州)、华东2(上海)、华北2(北京)或者华北3(张家口)地域下创建时序模型实例。

  • 使用 SDK 方式进行操作时,还需要初始化 TimeseriesClient。具体操作,请参见初始化 TimeseriesClient

自定义时间线标识

时序模型的时间线标识默认由度量名称、数据源和标签组成,时间线标识在时序表中对应的名称分别为 _m_name、_data_source 和 _tags。其中标签由多个字符串类型的键值对组成。

当时间线标识的默认名称不满足您的业务使用需求时,您可以通过自定义时间线标识使其更贴合实际应用场景,提高数据处理和分析的直观性和效率。例如监控服务器 CPU 的利用情况时使用时间线标识定位每一个 CPU 核心。自定义时间线标识后,您仍然可以使用时间线标识的默认名称进行数据操作。

要自定义时间线标识,您需要首先在创建时序表时自定义时间线标识,然后使用自定义时间线标识写入数据到时序表。具体使用流程如下:

使用控制台

  1. 在创建时序表时,自定义时间线标识。具体操作,请参考时序表操作

  2. 使用自定义时间线标识写入时序数据到时序表。

    写入数据到时序表时,客户端中的自定义时间线标识字段会以标签键值对的形式传递给表格存储服务端,表格存储服务端会先从自定义时间线标识字段键值对中提取出度量名称和数据源,剩余键值对作为时间线标签。具体操作,请参考写入时序数据

    重要

    如果创建时序表时,自定义的时间线标识中不包含标签,但是写入时序数据时,自定义时间线标识字段的键值对排除度量名称和数据后仍然有键值对剩余,则数据行会写入失败。

  3. 读取时序表中数据。

    1. 为时序表创建 SQL 映射关系。更多信息,请参见创建多值模型映射关系

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

      2. 单击 SQL 查询页签下方左侧,单击时序模型实例名称的“+”。

      3. 创建映射表的对话框中,按照如下说明配置映射表信息。

        参数

        描述

        表名

        时序表名称。

        映射表名

        映射表名称。

        说明

        为时序表创建 SQL 映射关系时,系统会自动在映射表名前添加时序表名::的前缀。

        使用分析存储查询

        分析存储功能主要用于时序数据长期存储和分析场景。使用分析存储(Analytical Store)功能,您可以低成本存储时序数据以及快速查询和分析时序数据。更多信息,请参见时序分析存储概述

        系统默认关闭使用分析存储查询开关,请根据实际业务场景进行相应配置。

        • 如果不需要使用分析存储来存储与分析时序数据,使用分析存储查询保持默认配置即可。

        • 如果需要低成本存储时序数据以及快速查询和分析时序数据,请确保已创建分析存储并打开使用分析存储查询开关。

        重要

        如果创建了使用分析存储查询的 SQL 映射表,则在删除分析存储时,您需要同时删除分析存储 SQL 映射表。否则会导致删除分析存储失败。

      4. 单击生成 SQL,系统会自动生成创建 SQL 映射关系的 SQL 语句。

        自定义时间线标识后,在创建 SQL 映射关系时,需要将时间线标识和作为主键的数据字段设置为 SQL 映射表的主键。

      5. 单击执行 SQL

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

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

      以下示例用于查询时序表的映射表 cpu::ts1 中 cpu_usage 值超过 90.0 的时间线信息。

      SELECT `host`, `processor`, `_tags` , `_time` FROM `cpu::ts1` WHERE cpu_usage > 90.0;

使用 SDK

重要

表格存储 Java SDK 从 5.17.1 版本开始支持自定义时间线标识功能。使用该功能时,请确保获取了正确的 Java SDK 版本。关于 Java SDK 历史迭代版本的更多信息,请参见 Java SDK 历史迭代版本

  1. 在创建时序表时,自定义时间线标识。

    以下示例用于创建一个不带分析存储的时序表,同时自定义时间线标识。

    private static void createTimeseriesTable(TimeseriesClient client) {
        TimeseriesTableMeta timeseriesTableMeta = new TimeseriesTableMeta("<TIMESERIES_TABLE_NAME>");
        timeseriesTableMeta.setTimeseriesTableOptions(new TimeseriesTableOptions(-1));
        // 自定义时间线表标识。度量名称对应名称为host,数据源对应名称为processor,标签对应名称为_tags。
        timeseriesTableMeta.addTimeseriesKey("host");
        timeseriesTableMeta.addTimeseriesKey("processor");
        timeseriesTableMeta.addTimeseriesKey("_tags");
        CreateTimeseriesTableRequest request = new CreateTimeseriesTableRequest(timeseriesTableMeta);
        request.setEnableAnalyticalStore(false);
        client.createTimeseriesTable(request);
    }
  2. 使用自定义时间线标识写入时序数据到时序表。

    写入数据到时序表时,客户端中的自定义时间线标识字段会以标签键值对的形式传递给表格存储服务端,表格存储服务端会先从自定义时间线标识字段键值对中提取出度量名称和数据源,剩余键值对作为时间线标签。

    重要

    如果创建时序表时,自定义的时间线标识中不包含标签,但是写入时序数据时,自定义时间线标识字段的键值对排除度量名称和数据后仍然有键值对剩余,则数据行会写入失败。

    以下示例用于使用自定义时间线标识写入 3 行时序数据到时序表中。

    private static void putTimeseriesData(TimeseriesClient client) {
        long timeInUs = System.currentTimeMillis() * 1000;
        List<TimeseriesRow> rows = new ArrayList<TimeseriesRow>();
        for (int i = 0; i < 3; i++) {
            Map<String, String> tags = new HashMap<>();
            // 添加自定义时间线标识字段
            tags.put("host", "1");
            tags.put("processor", String.valueOf(i));
            // 不属于自定义标识字段额的键值对会添加到标签中
            tags.put("region", "hangzhou");
            TimeseriesKey timeseriesKey = new TimeseriesKey("cpu", "host_" + i, tags);
            TimeseriesRow row = new TimeseriesRow(timeseriesKey, timeInUs);
            row.addField("cpu_usage", ColumnValue.fromDouble(10.0));
            row.addField("cpu_sys", ColumnValue.fromDouble(5.0));
            rows.add(row);
        }
        String tableName = "<TIMESERIES_TABLE_NAME>";
        PutTimeseriesDataRequest putTimeseriesDataRequest = new PutTimeseriesDataRequest(tableName);
        putTimeseriesDataRequest.setRows(rows);
        client.putTimeseriesData(putTimeseriesDataRequest);
    }

    数据写入成功后,时序表中的时序数据如下:

    host

    processor

    _tags

    _time

    cpu_usage

    cpu_sys

    1

    0

    ["region=hangzhou"]

    1712476524000000

    10.0

    5.0

    1

    1

    ["region=hangzhou"]

    1712476524000000

    10.0

    5.0

    1

    2

    ["region=hangzhou"]

    1712476524000000

    10.0

    5.0

  3. 使用 SQL 读取时序表中数据。

    1. 为时序表创建 SQL 映射关系。更多信息,请参见创建多值模型映射关系

      自定义时间线标识后,在创建 SQL 映射关系时,您需要将自定义时间线标识和时间列设置为 SQL 映射表的主键。

      配置示例如下:

      CREATE TABLE `cpu::ts1` (
          `host` VARCHAR(1024),
          `processor` VARCHAR(1024),
          `_tags` VARCHAR(1024),
          `_time` BIGINT(20),
          `cpu_usage` DOUBLE,
          `cpu_sys` DOUBLE,
          PRIMARY KEY(`host`,`processor`,`_tags`,`_time`)
      );
    2. 使用 SELECT 语句查询数据。更多信息,请参见查询数据

      以下示例用于查询时序表的映射表 cpu::ts1 中 cpu_usage 值超过 90.0 的时间线信息。

      SELECT `host`, `processor`, `_tags` , `_time` FROM `cpu::ts1` WHERE cpu_usage > 90.0;

配置作为主键的数据字段

时序表中通过时间线标识和时间点唯一确定一行时序数据,即不存在时间线标识和时间点相同但是数据不同的时间线。

当实际业务中存在时间线标识和时间点相同但是时序数据不同的数据存储需求时,您可以通过为时序表添加作为主键的数据字段来实现。例如,监控服务器 CPU 的利用情况时要使用时间线标识定位每台服务器,但是每台服务器有多个核心,此时即可将核心编号 processor 添加为作为主键的数据字段。

要使用字段主键,您需要首先在创建时序表时添加作为主键的数据字段,然后写入数据到时序表时配置作为主键的数据字段的值。具体使用流程如下:

使用控制台

  1. 在创建时序表时,配置作为主键的数据字段。具体操作,请参考时序表操作

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

    写入数据到时序表时,作为主键的数据字段不能为空,使用作为主键的数据字段能够存入多行相同时间线标识和时间点的时序数据。具体操作,请参考写入时序数据

  3. 读取时序表中数据。

    1. 为时序表创建 SQL 映射关系。更多信息,请参见创建多值模型映射关系

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

      2. 单击 SQL 查询页签下方左侧,单击时序模型实例名称的“+”。

      3. 创建映射表的对话框中,按照如下说明配置映射表信息。

        参数

        描述

        表名

        时序表名称

        映射表名

        映射表名称

        说明

        为时序表创建 SQL 映射关系时,系统会自动在映射表名前添加时序表名::的前缀。

        使用分析存储查询

        分析存储功能主要用于时序数据长期存储和分析场景。使用分析存储(Analytical Store)功能,您可以低成本存储时序数据以及快速查询和分析时序数据。更多信息,请参见时序分析存储概述

        系统默认关闭使用分析存储查询开关,请根据实际业务场景进行相应配置。

        • 如果不需要使用分析存储来存储与分析时序数据,使用分析存储查询保持默认配置即可。

        • 如果需要低成本存储时序数据以及快速查询和分析时序数据,请确保已创建分析存储并打开使用分析存储查询开关。

        重要

        如果创建了使用分析存储查询的 SQL 映射表,则在删除分析存储时,您需要同时删除分析存储 SQL 映射表。否则会导致删除分析存储失败。

      4. 单击生成 SQL,系统会自动生成创建 SQL 映射关系的 SQL 语句。

        为时序表配置作为主键的数据字段后,在创建 SQL 映射关系时,您需要将时间线标识和作为主键的数据字段设置为 SQL 映射表的主键。

      5. 单击执行 SQL

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

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

      以下示例用于查询时序表的映射表 cpu::ts1 中 cpu_usage 值超过 90.0 的时间线信息。

      SELECT `host`, `processor`, `_tags` , `_time` FROM `cpu::ts1` WHERE cpu_usage > 90.0;

使用 SDK

重要

表格存储 Java SDK 从 5.17.1 版本开始支持配置作为主键的数据字段功能。使用该功能时,请确保获取了正确的 Java SDK 版本。关于 Java SDK 历史迭代版本的更多信息,请参见 Java SDK 历史迭代版本

  1. 在创建时序表时配置作为主键的数据字段。

    以下示例用于创建一个不带分析存储的时序表,同时为其配置作为主键的数据字段。

    private static void createTimeseriesTable(TimeseriesClient client) {
        TimeseriesTableMeta timeseriesTableMeta = new TimeseriesTableMeta("<TIMESERIES_TABLE_NAME>");
        timeseriesTableMeta.setTimeseriesTableOptions(new TimeseriesTableOptions(-1));
        // 添加作为主键的数据字段。
        timeseriesTableMeta.addFieldPrimaryKey("processor", PrimaryKeyType.INTEGER);
        CreateTimeseriesTableRequest request = new CreateTimeseriesTableRequest(timeseriesTableMeta);
        request.setEnableAnalyticalStore(false);
        client.createTimeseriesTable(request);
    }
  2. 写入时序数据到时序表。

    写入数据到时序表时,作为主键的数据字段不能为空,使用作为主键的数据字段能够存入多行相同时间线标识和时间点的时序数据。

    以下示例用于向时序表中写入 3 行相同的时间线标识和时间点的时序数据。

    private static void putTimeseriesData(TimeseriesClient client) {
        long timeInUs = System.currentTimeMillis() * 1000;
        List<TimeseriesRow> rows = new ArrayList<TimeseriesRow>();
        for (int i = 0; i < 3; i++) {
            Map<String, String> tags = new HashMap<>();
            tags.put("region", "hangzhou");
            TimeseriesKey timeseriesKey = new TimeseriesKey("cpu", "host_1", tags);
            TimeseriesRow row = new TimeseriesRow(timeseriesKey, timeInUs);
            // 作为主键的数据字段不能为空
            row.addField("processor", ColumnValue.fromLong(i));
            row.addField("cpu_usage", ColumnValue.fromDouble(10.0));
            row.addField("cpu_sys", ColumnValue.fromDouble(5.0));
            rows.add(row);
        }
        String tableName = "cpu";
        PutTimeseriesDataRequest putTimeseriesDataRequest = new PutTimeseriesDataRequest(tableName);
        putTimeseriesDataRequest.setRows(rows);
        client.putTimeseriesData(putTimeseriesDataRequest);
    }

    数据写入成功后,时序表中的时序数据如下:

    _m_name

    _data_source

    _tags

    _time

    processor

    cpu_usage

    cpu_sys

    cpu

    host_1

    ["region=hangzhou"]

    1712476524000000

    0

    10.0

    5.0

    cpu

    host_1

    ["region=hangzhou"]

    1712476524000000

    1

    10.0

    5.0

    cpu

    host_1

    ["region=hangzhou"]

    1712476524000000

    2

    10.0

    5.0

  3. 使用 SQL 读取时序表中数据。

    1. 为时序表创建 SQL 映射关系。更多信息,请参见创建多值模型映射关系

      为时序表配置作为主键的数据字段后,在创建 SQL 映射关系时,您需要将时间线标识和作为主键的数据字段设置为 SQL 映射表的主键。

      配置示例如下:

      CREATE TABLE `cpu::ts1` (
          `_m_name` VARCHAR(1024),
          `_data_source`  VARCHAR(1024),
          `_tags` VARCHAR(1024),
          `_time` BIGINT(20),
          `processor` BIGINT,
          `cpu_usage` DOUBLE,
          `cpu_sys` DOUBLE,
          PRIMARY KEY(`_m_name`,`_data_source`,`_tags`,`_time`,`processor`)
      );
    2. 使用 SELECT 语句查询数据。更多信息,请参见查询数据

      以下示例用于查询时序表的映射表 cpu::ts1 中 cpu_usage 值超过 90.0 的时间线信息。

      SELECT `_m_name`, `_data_source`, `_tags` , `_time`, `processor` FROM `cpu::ts1` WHERE cpu_usage > 90.0;