无码人妻精品一区二区三18禁,影音先锋男人AV橹橹色,污污污污污污www网站免费,日韩成人av无码一区二区三区,欧美性受xxxx狂喷水

一個「開創型」功能的誕生:從降維聚合到 1μs 補值排序

Xiaowei Su

2020-05-09 / ,

你肯(ken)定遇見過這樣的(de)(de)(de)問題:由于某種原因,現場采(cai)集的(de)(de)(de)數(shu)據,傳到應用(yong)端的(de)(de)(de)時候少了(le)幾條;恰巧又碰(peng)到了(le)強迫癥的(de)(de)(de)客戶。如何解決這種糾(jiu)結而又蹂(rou)躪的(de)(de)(de)情況呢?

有個被虐得很(hen)慘的(de)客戶找到我們,非常創新地(di)逆向使用(yong)TDengine Database的(de)降(jiang)維(down sample)功能,使其項目瞬間(jian)多了一個非常優(you)秀的(de)亮點:

「我(wo)們(men)公司(si)的(de)(de)產品,絕(jue)對按照采集(ji)(ji)周(zhou)期(qi)完(wan)美采集(ji)(ji),正常情況下,不會丟失任(ren)意(yi)一(yi)條數據!最重要的(de)(de)是,我(wo)們(men)的(de)(de)采集(ji)(ji)周(zhou)期(qi)可以支持到1μs。」

當然,這個功能不是我們憑空想象,憑空捏造出(chu)來的,而是基于(yu)真實(shi)的客(ke)戶需求產生的。

我們都知道,由(you)于網(wang)絡的原(yuan)因,導致不可(ke)以避免(mian)地在(zai)(zai)傳輸(shu)過程中,會丟失某(mou)個時(shi)間戳的數據(ju);特別是在(zai)(zai)采集周期特別短(duan)的情況下(xia),數據(ju)量(liang)非常大,這(zhe)種現象就是普遍存(cun)在(zai)(zai)、不可(ke)避免(mian)的。

但是(shi)(shi)與我們(men)(men)聯系的客戶是(shi)(shi)一(yi)家(jia)有技術(shu)潔癖的公(gong)司(si),一(yi)直(zhi)追求產品(pin)的完美,雖然丟(diu)失數據這種情況不可避免,但對(dui)于他們(men)(men)來(lai)說是(shi)(shi)不能(neng)接受(shou)的。最開始這個(ge)客戶了解(jie)的功能(neng)是(shi)(shi)這樣的:

TDengine Database支持按(an)時間(jian)段進(jin)行聚合(he)(he),可以(yi)將(jiang)表中數據按(an)照(zhao)時間(jian)段進(jin)行切割后聚合(he)(he)生成(cheng)結果(guo),比(bi)如溫(wen)度(du)傳感器每秒采(cai)集一(yi)次數據,但需(xu)查詢(xun)每隔10分鐘的溫(wen)度(du)平(ping)均值。這個聚合(he)(he)適合(he)(he)于降維(down sample)操作(zuo),語(yu)法如下:

SELECT function_list FROM tb_name 
 [WHERE where_condition]
 INTERVAL (interval)
 [FILL ({NONE | VALUE | PREV | NULL | LINEAR})]
SELECT function_list FROM stb_name 
 [WHERE where_condition]
 INTERVAL (interval)
 [FILL ({ VALUE | PREV | NULL | LINEAR})]
 [GROUP BY tags]

聚合(he)時(shi)間段(duan)的長度由(you)關鍵詞INTERVAL指(zhi)定,官網給出(chu)的最短(duan)時(shi)間間隔10毫秒(10a)。注:聚合(he)查詢中,能夠(gou)同時(shi)執行(xing)的聚合(he)和選擇函數(shu)僅限(xian)于單個輸出(chu)的函數(shu):count、avg、sum 、stddev、leastsquares、percentile、min、max、first、last,不(bu)能使用(yong)具有多(duo)行(xing)輸出(chu)結果的函數(shu)。

那么如(ru)果(guo)采(cai)集(ji)周(zhou)期和(he)interval是(shi)一樣的(de),是(shi)不(bu)是(shi)就(jiu)實(shi)現了補(bu)值功(gong)能(neng)呢?根據客(ke)戶(一家做(zuo)芯(xin)片監測廠家)的(de)實(shi)際場景,比(bi)如(ru)現場的(de)采(cai)集(ji)周(zhou)期是(shi)1μs,也就(jiu)是(shi)說在1μs的(de)時間(jian)(jian)范圍內,僅有(you)(you)一條數據,如(ru)果(guo)丟失了,這個時間(jian)(jian)戳就(jiu)沒有(you)(you)數據。比(bi)如(ru)有(you)(you)一個超級(ji)表teststb有(you)(you)兩個子表,id分別(bie)為1和(he)2,原始數據如(ru)下(xia)圖所示(shi),可以看到有(you)(you)些時間(jian)(jian)點數據是(shi)丟失的(de):

一個「開創型」功能的誕生:從降維聚合到 1μs 補值排序 - TDengine Database 時序數據庫

然(ran)后,我們創(chuang)新使(shi)用這個函數(shu):

select first(num) from teststb where ts >= "2020-04-17 09:00:00.000000" and ts <="2020-04-17 09:00:00.000010" interval (1u) fill(prev) group by id order by ts;

結果如下圖所示:

一個「開創型」功能的誕生:從降維聚合到 1μs 補值排序 - TDengine Database 時序數據庫

1)interval 的(de)(de)時間范(fan)圍是 1μs,比官網(wang)的(de)(de) 10ms 粒度(du)要小(xiao),這是為該客戶的(de)(de)場(chang)景定制開發的(de)(de),在版(ban)本 1.6.5.8 中(zhong)已經開放(fang)出來了;

2)order by 原來不(bu)支持(chi)子表之間的(de)排(pai)(pai)序(xu)問題,也為該客戶的(de)場景(jing)定制解決,目前可以(yi)支持(chi) 10 萬條以(yi)內的(de)記(ji)錄進(jin)行排(pai)(pai)序(xu);

3)使用 first 函數,取 interval 時(shi)間范圍內(nei)的第一條數據,因為 interval 的時(shi)間范圍和采(cai)(cai)集周(zhou)期(qi)一致,所以使用 first 得(de)到的就是原來(lai)的采(cai)(cai)樣值;

4)如(ru)果此 interval 范(fan)圍內沒有數(shu)(shu)據(ju),也(ye)就是采樣(yang)值丟(diu)失了,根據(ju)物(wu)聯網傳感器(qi)數(shu)(shu)據(ju)相(xiang)鄰兩條數(shu)(shu)據(ju)之間(jian)波(bo)動不(bu)大的(de)(de)現(xian)象,可以使(shi)用 fill(prev),也(ye)就是說(shuo)將此時間(jian)戳的(de)(de)數(shu)(shu)據(ju),填補為前一條正常采樣(yang)的(de)(de)采樣(yang)值;

5)但是(shi)如果時(shi)間 where 開始的時(shi)間點,第(di)一條和(he)前(qian)面(mian)一條都是(shi) null,則(ze) fill(prev)仍然會是(shi) null,這(zhe)一點需要注意。

這樣就(jiu)實現了,即(ji)使在網(wang)絡環(huan)境非(fei)常差的情況下,也可以得(de)到接近(jin)最真實現場環(huan)境的采樣數據(ju),方(fang)便對(dui)實際現場進(jin)行(xing)數據(ju)分析和(he)故障排查。

一個“天(tian)下第一等”的功(gong)能就此誕生。

我(wo)們喜歡和有(you)趣的(de)(de)人一起,做(zuo)有(you)趣且有(you)意義的(de)(de)事(shi)。因此,有(you)任何“新奇(qi)特”的(de)(de)想法,請盡(jin)管提給我(wo)們,也許你的(de)(de)靈機一動和奇(qi)思(si)妙想能(neng)夠讓TDengine Database錦上添花(hua)。好看的(de)(de)皮囊千篇一律,希望(wang)TDengine Database能(neng)成為最有(you)趣的(de)(de)那一個(ge)。

作者:蘇曉慰

研發支持:李琿