上篇文章時序數(shù)據(jù)庫入門系列:什么是時序數(shù)據(jù)庫淳衙?介紹了時序數(shù)據(jù)庫的定義和發(fā)展趨勢,這次接著分享下時序數(shù)據(jù)庫的查詢相關(guān)的概念。
盡管時序數(shù)據(jù)的查詢類型或者場景多種多樣围辙,但時序數(shù)據(jù)庫的查詢類型浑测,整體上來說主要分成原始數(shù)據(jù)查詢、聚合數(shù)據(jù)查詢等兩種類型惠勒。
原始數(shù)據(jù)查詢,顧名思義爬坑,就是查詢原始數(shù)據(jù)纠屋,將寫入的數(shù)據(jù)原封不動的查詢出來。由于查詢結(jié)果粒度太細(xì)盾计,當(dāng)時間范圍較大時售担,結(jié)果集通常較大,業(yè)務(wù)處理起來比較困難署辉,且較難發(fā)現(xiàn)蘊含在結(jié)果集中的規(guī)律性和趨勢性灼舍。
聚合數(shù)據(jù)查詢,就是在通過聚合函數(shù)對原始數(shù)據(jù)進行處理涨薪,然后返回查詢結(jié)果集骑素。聚合數(shù)據(jù)查詢的計算主要有插值、降精度刚夺、聚合等3種類型的計算献丑。聚合數(shù)據(jù)查詢主要用來做數(shù)據(jù)分析,利用諸如QuickBI, Grafana等可視化工具來展現(xiàn)聚合查詢的結(jié)果侠姑,以方便發(fā)現(xiàn)蘊含在蘊含在時序數(shù)據(jù)中的規(guī)律性和趨勢性创橄。
其中,不管是原始數(shù)據(jù)查詢莽红、還是聚合數(shù)據(jù)查詢妥畏,時序數(shù)據(jù)的查詢一般都會帶上查詢時間范圍邦邦,一方面是根據(jù)時間范圍計算聚合時間窗口,另一方面是為了更高效的檢索數(shù)據(jù)醉蚁,提高查詢效率燃辖,避免大量無效數(shù)據(jù)的掃描。
為了下文更方便地介紹時序數(shù)據(jù)庫的查詢网棍,這里先給出一個時序數(shù)據(jù)的例子黔龟。
如上圖所示,這里給出了3臺風(fēng)力發(fā)電機的時序數(shù)據(jù)滥玷,其中氏身,由于某個原因,設(shè)備id為"7AD45HJ"設(shè)備在"2021-01-23T00:00:40Z"這個時刻沒有上報風(fēng)速這個下面就這個例子展開討論下時序數(shù)據(jù)的原始數(shù)據(jù)查詢和聚合數(shù)據(jù)查詢惑畴。
原始數(shù)據(jù)查詢
原始數(shù)據(jù)查詢蛋欣,有范圍查詢和最新值查找。
- 范圍查詢:比如查詢設(shè)備ID為"7AD45HJ"的在2021-01-23T00:00:10Z~2021-01-23T00:00:50Z這段時間范圍內(nèi)的數(shù)據(jù)如贷。
- 最新值查詢:比如查詢設(shè)備ID為"7AD45HJ"的最新值豁状,在上圖中,最新值為2021-01-23T00:00:50Z這個時刻對應(yīng)的功率和風(fēng)速倒得。
聚合數(shù)據(jù)查詢
聚合數(shù)據(jù)查詢的計算主要有插值、降精度夭禽、聚合等3種類型的計算霞掺。下面來看看具體是怎么工作的。
降精度
當(dāng)查詢的時間范圍比較長讹躯,只需返回一定精度的數(shù)據(jù)時使用菩彬。比如查詢設(shè)備ID為"7AD45HJ"的在2021-01-23T00:00:00Z~2021-01-23T00:00:50Z這段時間范圍內(nèi)的數(shù)據(jù)時,想以30秒時間粒度返回功率的平均值潮梯,那么需要使用平均值算子對原始數(shù)據(jù)進行處理骗灶。處理過程如下:
- 將原始數(shù)據(jù)以30秒為一個時間窗口分成多個時間區(qū)間, 這個例子為[0, 30), [30, 60)兩個區(qū)間,這兩個區(qū)間的功率值切分為[1800, 1750, 2000], [1863, 1823, 1865]秉馏。
- 然后對劃分好的時間區(qū)間內(nèi)的數(shù)據(jù)使用平均值算子求平均值耙旦,兩個區(qū)間的平均值分別為:1850.0, 1850.3
- 計算結(jié)果表示,降精度是將多個時間范圍內(nèi)多個數(shù)據(jù)點萝究,計算為每個時間范圍內(nèi)一個數(shù)據(jù)點免都,但時序數(shù)據(jù)查詢返回結(jié)果時,依然需要為每個數(shù)據(jù)點帶上時間戳帆竹。通常的辦法是范圍每個時間范圍對齊的第一個時間戳绕娘,即這個例子的計算結(jié)果表示為(2021-01-23T00:00:00Z, 1850.0), (2021-01-23T00:00:30Z, 1850.3)兩個時間戳值對。
從上面的例子來看栽连,降精度是將一條時間線的原始數(shù)據(jù)根據(jù)指定時間粒度险领,劃分為多個時間窗口侨舆,然后使用算子分別對這些時間窗口內(nèi)的數(shù)據(jù)做計算的過程绢陌。這個過程如下圖所示复颈。
不同的時序數(shù)據(jù)庫支持的降精度算子不盡相同帜讲,下圖是阿里云時序數(shù)據(jù)庫TSDB的降精度算子蚀苛,有如下幾種不等堵未。
前面提到雌芽,降精度是先把所有時間線按照指定精度切分,并把每個降精度區(qū)間內(nèi)的數(shù)據(jù)做一次運算。如果某個精度區(qū)間沒有值的話,可以使用填值策略進行指定在這個時間點填充具體的值娘荡。
比如回怜,以前面的時序數(shù)據(jù)的例子為例,設(shè)備id為"7AD45HJ"設(shè)備在"2021-01-23T00:00:40Z"沒有值,這時可以使用10秒粒度進行降精度查詢,并使用線性插值的填值策略進行填值志秃。這時對于設(shè)備id為"7AD45HJ"的設(shè)備而言怔球,其在2021-01-23T00:00:40Z時刻的值,就被填充為11.21 + (11.23 -11.21) / 20 * 10 = 11.22
不同的時序數(shù)據(jù)的支持的填值策略不同浮还,下圖是阿里云時序數(shù)據(jù)庫TSDB的填值策略竟坛,有如下幾種不等。
聚合
聚合就是把多條時間線的值按各個對齊時刻聚合為一條時間線的結(jié)果, 如果只有一條時間線碑定,則不進行聚合。聚合計算的過程如下圖所示又官。
聚合時必須要求每條時間線在對應(yīng)時刻都有值延刘,如果某條時間線在某個時刻沒有值,則會進行插值六敬。插值就是如果某條時間線某個精度區(qū)間沒有值且沒有使用填值策略進行填值碘赖,而待聚合的其他時間線中有一條時間線在此精度區(qū)間有值,則會對本時間線的這個缺值精度區(qū)間進行插值外构。
例如:降以及聚合條件為{"downsample": "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"這個時間點進行插值撼班。插值的方法與聚合的算子有關(guān),不同的時序數(shù)據(jù)庫的支持插值算法不同垒酬,下面是阿里云時序數(shù)據(jù)庫TSDB砰嘁,在不同的聚合算子下的插值方法列表件炉。
以開篇給出的時序數(shù)據(jù)為例,當(dāng)我們想計算廠商為“KingWind"的所有設(shè)備在每10秒時的風(fēng)速的平均值時矮湘,就會用到聚合和插值斟冕,其按照時間對其后的插值和聚合過程如下圖所示。標(biāo)紅的數(shù)字表示利用插值填充的值缅阳。
降精度和聚合計算的區(qū)別在于磕蛇,降精度是在單條時間線上做計算,在時間維度上表現(xiàn)為橫向計算十办;聚合是在多條時間線之間做計算秀撇,在時間維度上表現(xiàn)為縱向計算。