全部产品
阿里云办公

多值数据的读写

更新时间:2018-10-26 12:38:14

TSDB 支持使用 SDK 进行多值模式的数据读写。

在多值模式中, 一个 Metric 中可以包含多个 Fields 来多维度地细化定义 Metric,使得您可以同时写入和查询某监测设备(由 Tag 定义)在该 Metric 下的多维度时间线数据。

在多值模式中,时间序列的定义稍有变化,加入了 Field,即“一个 Metric + 一个 Field + N 个标签(N >= 1)+ N 个时间戳(N >= 1) + N 个值(N >= 1)”定义一个时间序列(时间线)。

本文通过示例代码指导您使用多值模型写入数据、查询数据以及获取最新数据点。

注意:多值模式仅在 0.0.10 版本及以上的 SDK 支持。关于最新 SDK 版本的说明及下载,请参见 SDK 版本说明

多值模型的数据写入

示例代码:

  1. * 异步写入通过multiValuedPut() API
  2. * 同步写入通过multiValuedPutSync() API
  3. * 两种方式都支持单点和多点(List)写入。
  4. *
  5. * 下面是必须写入时必须提供的信息:
  6. * Metric: 数据指标的类别。相当于influxdbMeasurement。但是需要namevaluename可以简单起"measurement"或者“metric”。例如:"metric":"wind"
  7. * Fields: 数据指标的度量信息(相当于指标下的子类别)。即一个metric支持多个field。如metricwind,该metric可以有多个fieldsdirection, speed, Beaufort numberdescription
  8. * Values: 度量对应的数值。而不是指标类别对应的数值。
  9. * Timestamp: 数据点的时间戳
  10. * Tags: 时间线额外的信息,如""、“型号=ABC123”、“出厂编号=1234567890”等。
  11. */
  12. MultiValuedPoint multiValuedPoint = MultiValuedPoint.metric("metric", "wind")
  13. .fields("speed", 30.58)
  14. .fields("direction", "Northwest")
  15. .fields("level", 5)
  16. .fields("description", "Fresh breeze")
  17. .tag("sensor", "6A04-1802-23FE")
  18. .tag("city", "hangzhou")
  19. .tag("province", "zhejiang")
  20. .timestamp(1532934538)
  21. .build();
  22. // 异步写入
  23. tsdb.multiValuedPut(multiValuedPoint);
  24. // 同步写入
  25. tsdb.multiValuedPutSync(multiValuedPoint);

多值模型的数据查询

示例代码:

  1. * 通过multiValuedQuery() API
  2. * 请求创建流程:MultiValuedQueryMetricDetails List -> MultiValuedSubQuery -> MultiValuedQuery
  3. * 现在多值查询只支持一个子查询。不同于单值查询。
  4. *
  5. * 查询时必须提供的信息:
  6. * MultiValuedQueryMetricDetails List: 查询指标下具体的度量(子类比)信息。例如只查询"speed"或者“direction
  7. * 里面可以指定值过滤(dpValue),斜率计算(rate),降采样(downsample)等。
  8. * Metric: 代表查询的数据指标,例如"metric":"wind"
  9. * Time Range: Start Time and End Time
  10. *
  11. * 可选信息:
  12. * Tags: 过滤时间的信息
  13. * Limit/Offset: 分页处理
  14. */
  15. List<MultiValuedQueryMetricDetails> metricDetails = new ArrayList<>();
  16. MultiValuedQueryMetricDetails metricDetail_1 = MultiValuedQueryMetricDetails.field("speed").aggregator(Aggregator.NONE)
  17. .build();
  18. metricDetails.add(metricDetail_1);
  19. MultiValuedQueryMetricDetails metricDetail_2 = MultiValuedQueryMetricDetails.field("direction").aggregator(Aggregator.NONE)
  20. .build();
  21. metricDetails.add(metricDetail_2);
  22. // Query without limit and offset
  23. MultiValuedSubQuery subQuery = MultiValuedSubQuery.metric("metric", "wind")
  24. .fieldsInfo(metricDetails)
  25. .tag("city", "hangzhou")
  26. .limit(10).offset(2)
  27. .build();
  28. MultiValuedQuery query = MultiValuedQuery.start(1532934338).end(1532934538).sub(subQuery).build();
  29. MultiValuedQueryResult result = tsdb.multiValuedQuery(query);

多值模型的获取最新数据点

示例代码:

  1. * 通过multiValuedQueryLast() API
  2. * 请求创建流程:MultiValuedQueryMetricDetails List -> MultiValuedSubQuery -> MultiValuedQuery
  3. * 现在多值查询只支持一个子查询。不同于单值查询。
  4. *
  5. * 查询时必须提供的信息:
  6. * Metric: 代表查询的数据指标,例如"metric":"wind"
  7. * Fields: 查询指标下具体的度量(子类比)信息
  8. *
  9. * 可选信息:
  10. * Tags: 过滤时间的信息
  11. * Limit/Offset: 分页处理
  12. */
  13. MultiValuedQueryLastRequest queryLast = MultiValuedQueryLastRequest.metric("metric","wind")
  14. .field("speed").field("direction").field("level").field("description")
  15. .tag("sensor", "6A04-1802-23FE").build();
  16. MultiValuedQueryLastResult lastResult = tsdb.multiValuedQueryLast(queryLast);

多值模型数据过滤

通过SDK,在多值模型下,可以在数据查询时对某个值指定值过滤条件,该过滤条件会影响到多个值的结果。相关SDK API接口:public Builder dpValue(String dpValueFilter)

示例代码:

  1. /**
  2. * 假设写入数据:
  3. * Measurement: wind
  4. * field1: direction
  5. * field2: speed
  6. * Measurement: wind
  7. * Timestamp Field: direction Field: speed
  8. * ts1 45.1 1.8
  9. * ts2 45.2 1.2
  10. * ts3 46 1.9
  11. * ts4 47 null
  12. * ts5 nul 1.1
  13. *
  14. * 此时如果指定值过滤条件为: speed >= 1.1
  15. * 那么查询返回结果为:
  16. * Timestamp Field: direction Field: speed
  17. * ts1 45.1 1.8
  18. * ts2 45.2 1.2
  19. * ts3 46 1.9
  20. * ts5 null 1.1
  21. *
  22. * 以下为示例代码:
  23. */
  24. MultiValuedQueryMetricDetails metricDetail_1 = MultiValuedQueryMetricDetails.field("direction").aggregator(Aggregator.NONE)
  25. .build();
  26. metricDetails.add(metricDetail_1);
  27. MultiValuedQueryMetricDetails metricDetail_2 = MultiValuedQueryMetricDetails.field("speed").aggregator(Aggregator.NONE)
  28. .dpValue(">=1.1")
  29. .build();
  30. metricDetails.add(metricDetail_2);
  31. MultiValuedSubQuery subQuery = MultiValuedSubQuery.metric("Measurement", "wind")
  32. .tag(TAGK1, TAGV1)
  33. .tag(TAGK2, TAGV2)
  34. .tag(TAGK3, TAGV3)
  35. .fieldsInfo(metricDetails)
  36. .build();
  37. MultiValuedQuery query = MultiValuedQuery.start(ts1).end(ts5).sub(subQuery).build();