全部产品
阿里云办公

查询数据

更新时间:2018-10-30 16:42:17

数据查询需要先构建一个 Query 对象。Query 对象表示查询条件,用于指定符合条件的 tags,metric,和聚合查询条件等。

构造查询条件

示例代码

构建一个 Query 对象,即查询条件:

  1. Query query = Query
  2. .timeRange(startTime, endTime) // 设置查询时间条件
  3. .sub(SubQuery.metric("hello").aggregator(Aggregator.AVG).tag("tagk1", "tagv1").build()) // 设置子查询
  4. .sub(SubQuery.metric("world").aggregator(Aggregator.SUM).tag("tagk2", "tagv2").build()) // 设置子查询
  5. .build();

子查询

每个 Query 对象可以设置多个 SubQuery,进行多个条件的查询。

示例代码

一个典型的子查询的构造:

  1. SubQuery subQuery = SubQuery
  2. .metric("test-metric")
  3. .aggregator(Aggregator.AVG)
  4. .downsample("60m-avg")
  5. .tag("tagk1", "tagv1")
  6. .tag("tagk2", "tagv2")
  7. .build();

其中,SubQuery 表示子查询对象,Aggregator 是一个枚举类型。

同步查询

HiTSDB SDK 提供了线程同步的数据查询。

示例代码

使用 query 方法同步的查询数据:

  1. List<QueryResult> result = tsdb.query(query);
  2. System.out.println("返回结果:" + result);

异步查询

TSDB SDK 提供了线程同步的数据查询。

示例代码

使用 query 方法同步的查询数据,并通过设置回调来设置异步查询后的行为:

  1. QueryCallback cb = new QueryCallback() {
  2. @Override
  3. public void response(Query input, List<QueryResult> result) {
  4. System.out.println("查询参数:" + input);
  5. System.out.println("返回结果:" + result);
  6. }
  7. };
  8. tsdb.query(query, cb);

逆序排序查询

TSDB SDK提供查询结果的逆序和顺序返回。通过 getOrderDps(boolean ordeset)接口函数查询结果逆序排序的查询,getOrderDps(true) 实现逆序,getOrderDps() 实现时间戳顺序来返回结果。示例代码

  1. Query query = Query
  2. .timeRange(current - 1000,start + 1000)
  3. .sub(SubQuery.metric(metric).aggregator(Aggregator.NONE).tag(tags).build())
  4. .build();
  5. try {
  6. // 执行查询,并获取查询结果
  7. List<QueryResult> result = tsdb.query(query);
  8. for(QueryResult queryResult : result){
  9. // 获取无序数据点
  10. System.out.println(queryResult.getDps());
  11. System.out.println("-------------");
  12. // 获取按时间戳由小到大排序的数据点集合
  13. System.out.println(queryResult.getOrderDps());
  14. System.out.println("-------------");
  15. // 获取按时间戳由大到小排序的数据点集合
  16. System.out.println(queryResult.getOrderDps(true));
  17. }
  18. } catch (HttpUnknowStatusException e) {
  19. e.printStackTrace();
  20. }

查询结果

使用 query 方法查询的数据以List<QueryResult>的形式返回,其中的QueryResult是每个子查询的查询结果。您可以使用QueryResultgetDps()方法获取查询的数据。

最新数据点查询

TSDB SDK提供查询指定时间戳前的最新数据点功能。代码示例:

示例1

子查询条件为metric和tags的查询:

  1. // 构建tags
  2. Map<String,String> tags = new HashMap<String, String>();
  3. tags.put("uid","1");
  4. tags.put("id","6");
  5. String metric = "test.1";
  6. // 构建最新点查询
  7. LastPointQuery query = LastPointQuery.builder()
  8. // 指定时间戳
  9. .timestamp(1537520409729l)
  10. // 以指定时间戳向前推进几个小时,默认为0,即指定时间戳所在的小时时间;
  11. // -1 表示向前推进直到找到数据为止
  12. .backScan(0)
  13. // 是否使用毫秒时间戳查询
  14. .msResolution(true)
  15. // 构建最新点子查询,用于查询指定时间线下的最新数据点,
  16. // 可以同时指定多个子查询
  17. .sub(LastPointSubQuery.builder(metric,tags).build()).build();
  18. // 时间线最新点查询结果,每条时间线对应一个LastDataValue
  19. List<LastDataValue> lastDataValues = tsdb.queryLast(query);
  20. System.out.println(lastDataValues);

示例2

子查询条件为时间线ID (tsuid)的查询。

  1. // 构造时间线Id集合
  2. List<String> tsuids = new ArrayList<String>();
  3. tsuids.add("10000B7C0000950000810000FF00006F");
  4. // 构建最新点查询
  5. LastPointQuery query = LastPointQuery.builder()
  6. // 指定时间戳
  7. .timestamp(1537520409729l)
  8. // 以指定时间戳向前推进几个小时,默认为0,即指定时间戳所在的小时时间;
  9. // -1 表示向前推进直到找到数据为止
  10. .backScan(0)
  11. // 是否使用毫秒时间戳查询
  12. .msResolution(true)
  13. // 构建最新点子查询,用于查询指定时间线下的最新数据点,
  14. // 可以同时指定多个子查询
  15. .sub(LastPointSubQuery.builder(tsuids).build()).build();
  16. // 时间线最新点查询结果,每条时间线对应一个LastDataValue
  17. List<LastDataValue> lastDataValues = tsdb.queryLast(query);
  18. System.out.println(lastDataValues);

其中,tsuids可以通过示例1的查询结果获取到,即首次使用示例1进行查询,将查询结果中的tsuids保存下来,下次可以直接使用tsuids来构建查询。