全部產品
Search
文件中心

Time Series Database:查詢資料

更新時間:Jul 06, 2024

資料查詢需要先構建一個 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來構建查詢。