全部產品
Search
文件中心

Time Series Database:多值資料查詢

更新時間:Jul 06, 2024

本文介紹多值資料查詢方法。

多值模型資料查詢 mquery

請求路徑和方法

請求路徑

要求方法

描述

/api/mquery

POST

查詢資料

重要

多值模型資料和原來寫入的單值模型資料不相容。單值模型資料需要通過原有的/api/put介面進行寫入。同時多值寫入資料需要通過/api/mquery介面進行查詢,單值寫入的資料需要通過/api/query進行查詢。

請求內容

名稱

類型

是否必選

描述

預設值

舉例

start

Long

是

開始時間,單位為秒或者毫秒。判斷規則詳見下面的“時間戳記說明”。

無

1499158925

end

Long

否

結束時間,單位為秒或者毫秒。判斷規則詳見下面的“時間戳記說明”。預設值為TSDB伺服器目前時間。

目前時間

1499162916

queries

Array

是

子查詢數組。

無

見子查詢說明

msResolution

boolean

否

子查詢數組。

false

該參數只對未經處理資料單位是秒的查詢生效。當該參數設定為true時,查詢結果中的時間戳記會轉換為毫秒,否則仍保留原始時間單位,對於未經處理資料是毫秒的查詢,返回結果中時間戳記始終為毫秒。

hint

Map

否

查詢Hint化。

無

見查詢Hint化說明。

時間戳記說明

時間戳記的單位可以是秒或者毫秒。TSDB會通過數值大小來判斷時間戳記的單位,規則如下:

  • 時間戳記區間為 [4284768,9999999999]:判斷為秒,表示的日期時間區間為:[1970-02-20 00:59:28,2286-11-21 01:46:39] 。

  • 時間戳記區間為 [10000000000,9999999999999]:判斷為毫秒,表示的日期時間區間為:[1970-04-27 01:46:40.000,,2286-11-21 01:46:39.999] 。

  • 時間戳記區間為 (-∞,4284768)和(9999999999999,+∞):判斷為非法時間戳記區間。

    說明

    適用於寫入資料 (/api/put & /api/mput)和查詢資料(/api/query & /api/mquery)兩個介面。

單時間點資料查詢

TSDB支援單時間點資料查詢。您可以將開始時間和結束時間設定為相同的數值。

例如:"start":1356998400,"end":1356998400。

子查詢 JSON 格式

名稱

類型

是否必選

描述

預設值

舉例

metric

String

是

指標名。

無

wind

fields

List

是

域查詢資訊。

無

-

rate

Boolean

否

是否計算指定指標值的增長速率,計算公式:Vt-Vt-1/t1-t-1。

false

true

delta

Boolean

否

是否計算指定指標值的差值,計算公式:Vt-Vt-1。

false

true

limit

Integer

否

資料分頁,子查詢每條時間序列返回資料點的最大數目。

0

1000

offset

Integer

否

資料分頁,子查詢每條時間序列返回資料點的位移量。

0

500

dpValue

String

否

根據提供條件過濾返回資料點,支援“>”,“<”, “=”,”<=”, “>=”, “!=”。

無

>=1000

preDpValue

String

否

根據提供的條件在掃描未經處理資料點時進行過濾,支援”>”, “<”, “=”,”<=”, “>=”, “!=”。

說明

它與dpValue的不同在於前者是對查詢完成後計算的結果進行值過濾,後者是在儲存的資料點進行掃描時進行值過濾,使得不滿足過濾條件的資料點根本不會加入查詢計算。

無

>=1000

downsample

String

否

時間維度降採樣。

無

60m-avg

tags

Map

否

指定查詢標籤過濾,和filters衝突。

無

-

filters

List

否

過濾器,和tags衝突。

無

-

hint

Map

否

查詢Hint化。

無

見查詢Hint化說明

說明

  • 一個查詢中能夠包含的總的Field個數最多不超過200個。 樣本如下:

    假設現有一個查詢包含3個子查詢,第一個子查詢包含3個Field,第二個子查詢包括2個Field,第三個子查詢包含6個Field,那麼這個查詢包含的總的Field個數totalFields=3+2+6=11,即查詢時需要保證totalFields不能大於200。

  • tags和filters都指定的情境下,後指定的過濾條件生效。

域查詢資訊 JSON 格式

名稱

類型

是否必選

描述

預設值

舉例

aggregator

String

是

彙總函式,詳見下面的“彙總(Aggregate)說明”。

無

sum

field

String

是

網域名稱稱,”*”代表查詢指標下所有域。

無

-

alias

String

否

網域名稱稱在返回結果中新名字。

無

-

downsample

String

否

時間維度降採樣。

無

60m-avg

rate

Boolean

否

是否計算指定指標值的增長速率,計算公式: Vt-Vt-1/t1-t-1。

false

true

dpValue

String

否

根據提供條件過濾返回資料點,支援“>”、“<”、 “=”、“<=”、“>=”、 “!=”。

無

>=1000

where

String

否

當域查詢資訊的field指定為萬用字元“*”時,該欄位用於指定過濾最終查詢結果時針對哪個欄位進行過濾。其本質與dpValue相同,都是後過濾。

無

f1>=100

說明

關於 limit、dpValue、downsample、tags和filters的詳細資料請見下面的相關說明。

查詢樣本

請求:POST/api/mquery請求體

{
    "start" : 1346846400,
    "end" :   1346846411,
    "msResolution" : true,
    "queries" : [
        {
            "metric" : "wind",
            "fields" : [
                {
                    "field" : "speed",
                    "aggregator" : "sum",
                    "downsample" : "2s-last",
                      "alias" : "speed_sum"
                },
                {
                    "field" : "*",
                    "aggregator" : "sum",
                    "downsample" : "2s-count",
                    "where":"speed>10"
                }
            ]
        }
    ]
}

資料分頁查詢(Limit 和 Offset)說明

Limit:子查詢每條時間序列返回資料點的最大數目。預設值是0,代表不限制返回點數量。

Offset:子查詢每條時間序列返回資料點的位移量。預設值也是0,代表不位移返回的資料點。

重要
  • limit和offset不能為負數。

  • limit和offset是對最後多值返回結果的分頁查詢處理,而不是對某一域查詢結果進行處理。

樣本

返回第1001到1500的資料點,則limit設為500,offset設為1000。

{
    "start" : 1346846400,
    "end"  :  1346846411,
    "msResolution" : true,
    "queries" : [
        {
            "metric" : "wind",
            "fields" : [
                {
                    "field" : "*",
                    "aggregator" : "sum",
                    "downsample" : "2s-count"
                }
            ],
            "filters" : [
                {
                    "filter" : "IOTE_8859_0005|IOTE_8859_0004",
                    "tagk" : "sensor",
                    "type" : "literal_or"
                }
            ],
            "limit" : 500,
            "offset" : 1000
        }
    ]
}

值過濾(dpValue) 說明

根據使用者佈建的數值限制條件,過濾最終的返回資料點。支援 “>”、“<”、 “=”、 “<=”、 “>=”、 “!=”。

重要

不同 fields 之間的 dpValue 關係是“或”。“和”的關係暫時不支援。

字串僅支援“=”、“!=”。

樣本

{
    "start" : 1346846400,
    "end" :   1346846411,
    "msResolution" : true,
    "queries" : [
        {
            "metric" : "wind",
            "fields" : [
                {
                    "field" : "level",
                    "aggregator" : "avg",
                    "downsample" : "2s-avg",
                    "dpValue" : ">=8.0"
                }
            ],
            "filters" : [
                {
                    "filter" : "IOTE_8859_0005|IOTE_8859_0004",
                    "tagk" : "sensor",
                    "type" : "literal_or"
                }
            ]
        }
    ]
}

差值(delta)說明

當使用者在子查詢中指定差值運算元的時候,TSDB返回的資料的dps中的key-value對的value值將是計算所得的差值。

重要

如果未指定差值時返回的dps中有n個key-value對,那麼計算完差值後返回的dps中將只包含n-1個key-value對(第一個key-value對因無法求差值將被捨去)。差值運算元對於Downsample後的值也同樣適用。

使用者指定了差值運算元時,還可以進一步在子查詢中指定deltaOptions來對求差值的行為進行進一步控制。當前支援的deltaOptions如下所示:

名稱

類型

是否必選

描述

預設值

舉例

counter

Boolean

否

當該標記位被指定時,則表示假定用於計算差值的指標值,被使用者視作是一個類似計數器的單調遞增(或遞減)的累計值(伺服器並不會加以檢查)。

false

true

counterMax

Integer

否

當counter被設定為true時,該值用於指定差值的閾值。當差值的絕對值超過該閾值時將被視作異常值,該值不指定時則對差值不設閾值。

無

100

dropReset

Boolean

否

該標記位需要與上述counterMax結合使用。當通過指定counterMax 後計算出了異常的差值,dropReset決定是否要直接丟棄異常的差值。若指定為true,則異常值直接被丟棄,若指定為false(預設情況),則異常值被重設為零。

false

true

樣本

    {
       "start":1346046400,
       "end":1347056500,
       "queries":[
          {
             "aggregator":"none",
             "downsample":"5s-avg",
             "delta":true,
             "deltaOptions":{
                 "counter":true,
                 "counterMax":100
             }
             "metric":"sys.cpu.0",
             "dpValue":">=50",
             "tags":{
                "host":"localhost",
                "appName":"hitsdb"
             }
          }
       ]
    }

降採樣(Downsample)說明

當查詢的時間範圍比較長,只需要返回每個時間間隔的統計值時使用。查詢結果返回的時間戳記是按照查詢指定的間隔對齊後的時間區間起始值。查詢格式如下:

<interval><units>-<aggregator>[-fill policy]
重要

指定了降採樣後,查詢指定的起始時間範圍會自動按照指定的interval區間向前後取整對齊。例如,指定時間戳記範圍為[1346846401,1346846499] ,指定的interval為5m,則查詢真實的時間戳記範圍為[1346846101,1346846799]。

其中:

  • interval:指數值,如 5、60等,特殊的“0all”表示時間維度彙總為一個點。

  • units:s代表秒,m代表分,h代表小時,d代表天,n代表月,y代表年。

    說明

    • 預設按照時間戳記模數對齊,即“對齊時間戳記=資料時間戳記-(資料時間戳記 % interval)”。

    • 支援基於日曆時間間隔的降採樣。要使用日曆界限,您需要在時間單位units後添加一個c。例如,1dc代表從當日零點到次日零點之間的 24 小時。

  • aggregator:降採樣使用的運算元及其說明如下表所示。

運算元

描述

avg

平均值。

count

資料點數。

first

取第一個值。

last

取最後一個值。

min

最小值。

max

最大值。

sum

求和。

zimsum

求和。

rfirst

功能同first但降採樣後返回的結果的時間戳記是未經處理資料的時間戳記,而非降採樣對齊後的時間戳記。

rlast

功能同last但降採樣後返回的結果的時間戳記是未經處理資料的時間戳記,而非降採樣對齊後的時間戳記。

rmin

功能同min但降採樣後返回的結果的時間戳記是未經處理資料的時間戳記,而非降採樣對齊後的時間戳記。

rmax

功能同max但降採樣後返回的結果的時間戳記是未經處理資料的時間戳記,而非降採樣對齊後的時間戳記。

說明

當降採樣的彙總運算元指定為rfirst, rlast, rmin或rmax時,不能再在降採樣運算式中指定fill policy。

Fill policy

Fill policy即填值。降採樣先把所有時間軸按照指定精度切分,並把每個降採樣區間內的資料做一次運算,降採樣後如果某個精度區間沒有值,fill policy可以指定在這個時間點填充具體的值。比如某條時間軸降採樣後的時間戳記為:t+0,t+20,t+30,此時如果不指定fill policy,只有3個值,如果指定了fill policy為null,此時間軸會有4個值,其中t+10時刻的值為null。Fill policy與具體填儲值的對應如下表所示。

Fill Policy

填儲值

none

預設行為,不填值。

nan

NaN

null

null

zero

0

linear

線性填儲值。

previous

之前的一個值。

near

鄰近的一個值。

after

之後的一個值。

fixed

用指定的一個固定填儲值(請參照下面樣本)。

Fixed Fill Policy

使用方法:將固定的填儲值寫到 “#”之後。填儲值支援正負數。格式如下:

<interval><units>-<aggregator>-fixed#<number>

樣本:1h-sum-fixed#6, 1h-avg-fixed#-8

降採樣樣本

樣本:1m-avg,1h-sum-zero,1h-sum-near

重要

在域查詢資訊中,downsample 不是必要條款。您甚至可以在查詢時明確標明其值為null或者空(""),例如:{"downsample": null} 或者 {"downsample": ""},這樣就不會觸發資料點降採樣。但是,如果又一個域查詢使用了downsample,在同一子查詢下的所有域查詢資訊都需要包括 downsample並且採用同樣的降採樣區間。

彙總(Aggregate)說明

在降採樣後會得到多條時間軸的值,並且這些時間軸的時間戳記是對齊的,而彙總就是把多條時間軸的值按各個對齊時刻彙總為一條時間軸的結果(注意:如果只有一條時間軸,則不進行彙總)。彙總時必須要求每條時間軸在對應時刻都有值,如果某條時間軸在某個時刻沒有值,則會進行插值,插值描述如下。

重要

在域查詢資訊中,aggregator是必要條款,但是可以通過none來指明不做彙總運算。但是,TSDB多值模型不支援在同一個查詢中有的域做彙總,有的域不做彙總。

插值

如果某條時間軸某個精度區間沒有值且沒有使用fill policy進行填值,而待彙總的其他時間軸中有一條時間軸在此精度區間有值,則會對本時間軸的這個缺值精度區間進行插值。

例如:降採樣以及彙總條件為{"downsample": "10s-avg", "aggregator": "10s-avg", "aggregator": "sum"} ,有兩條時間軸需要使用 sum彙總,按10s-avg做降採樣後的這兩條時間軸有值的時間戳記分別為:

line 1:t+0,t+10,t+20,t+30、line 2:t+0,t+20,t+30。

第二條時間軸 line 2 缺 “t+10” 這個時刻的值,那麼在彙總前會對line 2的“t+10”這個時間點進行插值。插值的方法與彙總的運算元有關,詳見下面的運算元列表。

運算元

描述

插值方法

avg

平均值

線性插值(斜率擬合)

count

資料點數

插 0

mimmin

最小值

插最大值

mimmax

最大值

插最小值

min

最小值

線性插值

max

最大值

線性插值

none

不做計算

插 0

sum

求和

線性插值

zimsum

求和

插 0

Filters 說明

有以下兩種方法可以指定filter:

  • 在指定 tagk 時指定filter:

    • tagk = *:對tagk下面的tagv做分組,相同的tagv做彙總。

    • tagk = tagv1|tagv2:分別對tagk下面的tagv1和tagv2資料做彙總。

  • 使用JSON格式指定filter:

名字

類型

是否必選

描述

預設值

舉例

type

String

是

filter 類型,詳見下面說明。

無

literal_or

tagk

String

是

指定tagk名。

無

host

filter

String

是

filter運算式。

無

web01丨web02

groupBy

Boolean

否

是否按照tagv 做分組。

false

false

Filter 類型說明

名稱

filter 舉例

描述

literal_or

web01丨web02

分別對多個tagv做彙總,區分大小寫。

wildcard

*.example.com

分別對滿足萬用字元的tagv做彙總,區分大小寫。

查詢樣本

包含 filter 的查詢樣本

請求體:

{
    "start" : 1346846400,
    "end" :   1346846411,
    "msResolution" : true,
    "queries" : [
        {
            "metric" : "wind",
            "fields" : [
                {
                    "field" : "speed",
                    "aggregator" : "none",
                    "alias" : "column_speed"
                },
                {
                      "field" : "*",
                    "aggregator" : "none",
                    "alias" : "column_"
                }
            ],
            "filters" : [
                {
                    "filter" : "IOTE_8859_0005|IOTE_8859_0004",
                    "tagk" : "sensor",
                    "type" : "literal_or"
                }
            ]
        }
    ]
}

查詢結果說明

查詢成功的HTTP響應碼為200,響應內容為JSON格式資料。說明如下:

名稱

描述

metric

指標名。

columns

查詢結果對應的列的名稱。

tags

tagv未做彙總的tag。

aggregateTags

tagv做了彙總的tag。

values

Tuple結構查詢結果。

響應結果樣本:

  • Aggregator : None情境樣本

[
   {
      "metric":"wind",
      "columns":[
         "timestamp",
         "column_speed",
         "column_description",
         "column_direction",
         "column_level",
         "column_speed"
      ],
      "tags":{
         "city":"hangzhou",
         "country":"china",
         "province":"zhejiang",
         "sensor":"IOTE_8859_0005"
      },
      "aggregatedTags":[],
      "values":[
         [ 1346846406000, null, "Fresh breeze", "East", 0.5, null ],
         [ 1346846407000, null, "Fresh breeze", "South", 1.5, null ]
   },
   {
      "metric":"wind",
      "columns":[
         "timestamp",
         "column_speed",
         "column_description",
         "column_direction",
         "column_level",
         "column_speed"
      ],
      "tags":{
         "city":"hangzhou",
         "country":"china",
         "province":"zhejiang",
         "sensor":"IOTE_8859_0004"
      },
      "aggregatedTags":[],
      "values":[
         [ 1346846400000, 40.4, "Fresh breeze", "East", 0.4, 40.4 ],
         [ 1346846401000, 41.4, "Fresh breeze", "South", 1.4, 41.4 ],
         [ 1346846402000, 42.4, "Fresh breeze", "West", 2.4, 42.4 ],
         [ 1346846403000, 43.4, "Fresh breeze", "North", 3.4,43.4 ]
   }
]
  • Aggregator:Avg 的情境樣本(查看杭州市所有sensor監控的平均風速和平均風等級)

[
  {
    "metric": "wind",
    "columns": [
      "timestamp",
      "avg_level",
      "avg_speed"
    ],
    "tags": {
      "city": "hangzhou"
    },
    "aggregatedTags": [
      "country",
      "province",
      "sensor"
    ],
    "values": [
      [1346846400000, 0.25, 40.25],
      [1346846401000, 1.25, 41.25],
      [1346846402000, 2.5, 42.5],
      [1346846411000, 5.5, null]
    ]
  }
]

查詢 Hint 化說明

情境說明

該特性主要是提高查詢速度。假設某一個tags A命中的時間軸明顯大於其他的tags B命中的時間軸,則需要捨棄,避免撈取tags A的大量時間軸之後,被tags B小規模時間軸交集後,結果集等於tags B。

格式說明

  • 目前的版本只支援tagk層級的查詢索引限制(hint下的tagk是固定寫法)。

  • 其中,0表示不使用對應tagk的索引,反之1表示使用對應tagk的索引。

版本說明

從v2.6.1版本開始支援hint特性。

查詢樣本

子查詢層級

{
  "queries": [
    {
      "metric": "demo.mf",
      "tags": {
        "sensor": "IOTE_8859_0001",
        "city": "hangzhou",
        "province": "zhejiang",
        "country": "china"
      },
      "fields": [
        "speed"
      ],
      "hint": {
        "tagk": {
          "dc": 1
        }
      }
    }
  ]
}

整體查詢層級

{
  "queries": [
    {
      "metric": "demo.mf",
      "tags": {
        "sensor": "IOTE_8859_0001",
        "city": "hangzhou",
        "province": "zhejiang",
        "country": "china"
      },
      "fields": [
        "speed"
      ]
    }
  ],
  "hint": {
    "tagk": {
      "dc": 1
    }
  }
}

異常情況

不可同時指定 0 和 1

{
  "start": 1346846400,
  "end": 1346846400,
  "queries": [
    {
      "aggregator": "none",
      "metric": "sys.cpu.nice",
      "tags": {
        "dc": "lga",
        "host": "web01"
      }
    }
  ],
  "hint": {
    "tagk": {
      "dc": 1,
      "host": 0
    }
  }
}

會返回如下報錯資訊:

{
    "error": {
        "code": 400,
        "message": "The value of hint should only be 0 or 1, and there should not be both 0 and 1",
        "details": "TSQuery(start_time=1346846400, end_time=1346846400, subQueries[TSSubQuery(metric=sys.cpu.nice, filters=[filter_name=literal_or, tagk=dc, literals=[lga], group_by=true, filter_name=literal_or, tagk=host, literals=[web01], group_by=true], tsuids=[], agg=none, downsample=null, ds_interval=0, rate=false, rate_options=null, delta=false, delta_options=null, top=0, granularity=null, granularityDownsample=null, explicit_tags=explicit_tags, index=0, realTimeSeconds=-1, useData=auto, limit=0, offset=0, dpValue=null, preDpValue=null, startTime=1346846400000, endTime=1346846400000, Query_ID=null)] padding=false, no_annotations=false, with_global_annotations=false, show_tsuids=false, ms_resolution=false, options=[])"
    }
}

不可指定除了 0 和 1 之外的值

{
  "start": 1346846400,
  "end": 1346846400,
  "queries": [
    {
      "aggregator": "none",
      "metric": "sys.cpu.nice",
      "tags": {
        "dc": "lga",
        "host": "web01"
      }
    }
  ],
  "hint": {
    "tagk": {
      "dc": 100
    }
  }
}

會返回如下報錯資訊:

{
    "error": {
        "code": 400,
        "message": "The value of hint can only be 0 or 1, and it is detected that '100' is passed in",
        "details": "TSQuery(start_time=1346846400, end_time=1346846400, subQueries[TSSubQuery(metric=sys.cpu.nice, filters=[filter_name=literal_or, tagk=dc, literals=[lga], group_by=true, filter_name=literal_or, tagk=host, literals=[web01], group_by=true], tsuids=[], agg=none, downsample=null, ds_interval=0, rate=false, rate_options=null, delta=false, delta_options=null, top=0, granularity=null, granularityDownsample=null, explicit_tags=explicit_tags, index=0, realTimeSeconds=-1, useData=auto, limit=0, offset=0, dpValue=null, preDpValue=null, startTime=1346846400000, endTime=1346846400000, Query_ID=null)] padding=false, no_annotations=false, with_global_annotations=false, show_tsuids=false, ms_resolution=false, options=[])"
    }
}