查詢數據
更新時間:
數據查詢需要先構建一個 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
是每個子查詢的查詢結果。您可以使用QueryResult
的getDps()
方法獲取查詢的數據。
最新數據點查詢
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來構建查詢。
文檔內容是否對您有幫助?