全部产品
Search
文档中心

时间序列数据库 TSDB:查询数据

更新时间:Nov 03, 2022

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

构造查询条件

示例代码

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

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

子查询

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

示例代码

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

SubQuery subQuery = SubQuery
                .metric("test-metric")
                .aggregator(Aggregator.AVG)
                .downsample("60m-avg")
                .tag("tagk1", "tagv1")
                .tag("tagk2", "tagv2")
                .build();

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

同步查询

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

示例代码

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

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

异步查询

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

示例代码

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

QueryCallback cb = new QueryCallback() {

    @Override
    public void response(Query input, List<QueryResult> result) {
        System.out.println("查询参数:" + input);
        System.out.println("返回结果:" + result);
    }

};

tsdb.query(query, cb);

逆序排序查询

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

Query query = Query
                .timeRange(current - 1000,start + 1000)
                .sub(SubQuery.metric(metric).aggregator(Aggregator.NONE).tag(tags).build())
                .build();

        try {
            // 执行查询,并获取查询结果
            List<QueryResult> result = tsdb.query(query);


            for(QueryResult queryResult : result){
                // 获取无序数据点
                System.out.println(queryResult.getDps());
                System.out.println("-------------");
                // 获取按时间戳由小到大排序的数据点集合
                System.out.println(queryResult.getOrderDps());
                System.out.println("-------------");
                // 获取按时间戳由大到小排序的数据点集合
                System.out.println(queryResult.getOrderDps(true));
            }
        } catch (HttpUnknowStatusException e) {
            e.printStackTrace();
        }

查询结果

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

最新数据点查询

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

示例1

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

// 构建tags
        Map<String,String> tags = new HashMap<String, String>();
        tags.put("uid","1");
        tags.put("id","6");

        String metric = "test.1";
        // 构建最新点查询
        LastPointQuery query = LastPointQuery.builder()
                // 指定时间戳
                .timestamp(1537520409729l)
                // 是否使用毫秒时间戳查询
                .msResolution(true)
                // 构建最新点子查询,用于查询指定时间线下的最新数据点,
                // 可以同时指定多个子查询
                .sub(LastPointSubQuery.builder(metric,tags).build()).build();

        // 时间线最新点查询结果,每条时间线对应一个LastDataValue
        List<LastDataValue> lastDataValues = tsdb.queryLast(query);

        System.out.println(lastDataValues);

示例2

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

// 构造时间线Id集合
        List<String> tsuids = new ArrayList<String>();
        tsuids.add("10000B7C000095000081****FF00006F");

        // 构建最新点查询
        LastPointQuery query = LastPointQuery.builder()
                // 指定时间戳
                .timestamp(1537520409729l)
                // 是否使用毫秒时间戳查询
                .msResolution(true)
                // 构建最新点子查询,用于查询指定时间线下的最新数据点,
                // 可以同时指定多个子查询
                .sub(LastPointSubQuery.builder(tsuids).build()).build();

        // 时间线最新点查询结果,每条时间线对应一个LastDataValue
        List<LastDataValue> lastDataValues = tsdb.queryLast(query);

        System.out.println(lastDataValues);

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