
在新能源行業中,多采用數據中臺來管理業務數據,使用時序數據庫(Time Series Database)來管理時序數據,他們的數據都來自數采網關。以(yi)風力發(fa)電場景為例,需要實時(shi)計(ji)算(suan)風機的各種 KPI 指標(biao),往往通(tong)過數據中臺的定時(shi)任務來(lai)完成這些計(ji)算(suan)。目前,現有的方(fang)案存在幾個方(fang)面(mian)的問題:
-
首(shou)先,由(you)于是定時任務,KPI 計(ji)算的(de)實時性(xing)無法保證,特別是在(zai) KPI 的(de)計(ji)算需要多個(ge)步驟才能完成的(de)情(qing)況下(xia),延(yan)遲可能會長達幾分(fen)鐘甚至十幾分(fen)鐘。
-
其次,由于數據中臺基于 Hadoop 生(sheng)態,架構臃腫、組件繁(fan)多,需(xu)要大(da)量服務器,不(bu)僅導致業(ye)務應用開發成(cheng)本高(gao)(gao)昂、同時(shi)也導致系統(tong)的(de)運維成(cheng)本居(ju)高(gao)(gao)不(bu)下(xia)。
因此,為了提高業務響應速度和實時性,客戶希望將 KPI 計算任務卸載到 TDengine。希望借助 TDengine 的流式計算功能,大幅度提升 KPI 計算的效率和實時性。采用 TDengine 流計算后,簡單的 SQL 即可實現 KPI 計算需求,將業務響應時間(流計算的開發時長)從數周縮短一兩天甚至數小時,極大地提高了業務響應能力,顯著地提高了企業的競爭力。
實時計算 95 個風機的平均風速
創建數據庫(ku)
-- 創建風力發電(dian)數據庫create database wind;
創(chuang)建超級表
-- 創建風機的(de)超級表create table wind_turbine (ts timestamp, wind_speed double, conn_state bool)tags (site_id varchar(20));
創建子表
-- 創建遙測風機(ji)子表 (YC_FJ_001)create table YC_FJ_001 using wind_turbine tags ('YC_FJ_001');……create table YC_FJ_095 using wind_turbine tags ('YC_FJ_095');
taosBenchmark -f insert_1s1row.json"non_stop_mode": "yes", # 持續寫入不停止 "interlace_rows": 1, # 交叉向每個子表寫入 "insert_interval": 1000, # 保持1000毫秒插入一條
創建(jian)流計算
-- 創建流計算,95個風機的平均風速(連接狀態斷開的風機不(bu)參(can)與計算)create stream stream_avg_speed trigger at_once into avg_speed_95as select _wstart as time, avg(wind_speed) as avg_speed from wind_turbinewhere conn_status = trueinterval(1s)
查詢流計算結(jie)果(guo)
-- 查詢流計算最新結果 select * from avg_speed_95 order by time desc limit 5; taos> select * from avg_speed_95 order by time desc limit 5; time | avg_speed | group_id | ============================================================================== 2024-06-26 01:22:23.000 | 26.166599999999992 | 0 | 2024-06-26 01:22:22.000 | 22.864500000000000 | 0 | 2024-06-26 01:22:21.000 | 1.101700000000000 | 0 | 2024-06-26 01:22:20.000 | 29.485700000000001 | 0 | 2024-06-26 01:22:19.000 | 24.481799999999996 | 0 | Query OK, 5 row(s) in set (0.009711s) taos> select * from avg_speed_95 order by time desc limit 5; time | avg_speed | group_id | ============================================================================== 2024-06-26 01:22:50.000 | 31.460899999999992 | 0 | 2024-06-26 01:22:49.000 | 8.252200000000000 | 0 | 2024-06-26 01:22:48.000 | 19.568899999999996 | 0 | 2024-06-26 01:22:47.000 | 5.945700000000001 | 0 | 2024-06-26 01:22:46.000 | 29.533400000000007 | 0 | Query OK, 5 row(s) in set (0.006516s)
復雜流計算場景
業務(wu)需求

-
n 為該日的(de)樣(yang)本總數,15 分鐘(zhong)一個點記作 i;pmi 為 i 時刻(ke)的(de)實際功率;ppi 為 i 時刻(ke)的(de)短期(qi)預測(ce)功率; -
若 pmi = 0,則 i 時刻的預測值直接 = 0; -
若 ppi > 2 * pmi,則(ze) i 時刻(ke)的結(jie)果直接 = 1; -
否則,預測(ce)值(zhi)按照(zhao)上面的公式計(ji)算。
創建超級表
-- 創建超級表create table power_predict (ts timestamp, ppi double, pmi double)tags (site_id varchar(20));-- 發電預測表create table YC_FJ001_PREDICT using power_predicttags ("YC_FJ001_PREDICT");
創建(jian)一階(jie)段流計算
-- KPI計算規則: -- 1. 當 pmi == 0時, ppi_percent = 0.0 -- 2. 當 ppi > 2*pmi 時, ppi_percent = 1.0 -- 3. 其他情況, ppi_percent = 1-sqrt(avg(pow(((pmi-ppi)/pmi), 2))) create stream stream_ppi_percent_1 trigger at_once into st_ppi_percent_1 as SELECT ts, ppi, pmi, case when pmi <= 0.0001 then 0.0 when ppi > 2*pmi then 1.0 else pow(((pmi-ppi)/pmi), 2) end as ppi_percent from power_predict partition by tbname; -- 這個必不可少
創建二階段(duan)流計算
create stream stream_ppi_percent trigger at_once into st_ppi_percent as select _wstart as ts, 1-sqrt(avg(ppi_percent)) from st_ppi_percent_1 interval(1d);
向源表寫(xie)入數據
insert into YC_FJ001_PREDICT values
('2024-06-25 12:00:00', 5500.00, 0.00)
('2024-06-25 13:00:00', 5000, 5500.00)
('2024-06-25 14:00:00', 15500, 5500.00)
('2024-06-26 12:00:00', 5500.00, 5000.00)
('2024-06-26 13:00:00', 5000, 0.00)
('2024-06-25 14:00:00', 15500, 5500.00);
查(cha)詢計(ji)算結果
-- 查詢流計算結果 taos> select * from st_ppi_percent_1 order by ts desc limit 20; ts | ppi | pmi | ppi_percent | group_id | ====================================================================================================================================== 2024-06-27 14:00:00.000 | 15500.000000000000000 | 5500.000000000000000 | 1.000000000000000 | 7041101957555052029 | 2024-06-27 13:00:00.000 | 5000.000000000000000 | 0.000000000000000 | 0.000000000000000 | 7041101957555052029 | 2024-06-27 12:00:00.000 | 5500.000000000000000 | 5000.000000000000000 | 0.010000000000000 | 7041101957555052029 | 2024-06-26 14:00:00.000 | 15500.000000000000000 | 5500.000000000000000 | 1.000000000000000 | 7041101957555052029 | 2024-06-26 13:00:00.000 | 5000.000000000000000 | 5500.000000000000000 | 0.008264462809917 | 7041101957555052029 | 2024-06-26 12:00:00.000 | 5500.000000000000000 | 0.000000000000000 | 0.000000000000000 | 7041101957555052029 | Query OK, 6 row(s) in set (0.007745s) taos> select * from st_ppi_percent order by ts desc limit 20; ts | 1-sqrt(avg(ppi_percent)) | group_id | ============================================================================== 2024-06-27 00:00:00.000 | 0.419770160482360 | 0 | 2024-06-26 00:00:00.000 | 0.420268894857303 | 0 | Query OK, 2 row(s) in set (0.007535s)
寫在(zai)最后
通(tong)過本(ben)文的介紹和(he)示(shi)例,我(wo)們可(ke)以清(qing)晰地(di)看到 TDengine 在(zai)處理(li)大規模時(shi)(shi)(shi)序數據和(he)實時(shi)(shi)(shi)流計(ji)算(suan)方面的強大功(gong)能。它不(bu)僅顯著提高(gao)了業(ye)務響應速度和(he)實時(shi)(shi)(shi)性,還大幅降低了系統的開發和(he)運(yun)維成(cheng)本(ben)。在(zai)新能源(yuan)領(ling)域 KPI 計(ji)算(suan)的實際應用中,TDengine 成(cheng)功(gong)地(di)解決了定時(shi)(shi)(shi)任務的延(yan)遲問題,實現了秒(miao)級甚(shen)至(zhi)毫秒(miao)級的實時(shi)(shi)(shi)計(ji)算(suan)。
未來(lai)(lai),隨著(zhu)業務(wu)需求的(de)不(bu)斷增長和(he)復雜性提升(sheng),TDengine 的(de)流計(ji)算能(neng)力將為更多場景提供高效、可靠的(de)解決方案(an)。希(xi)望本文(wen)的(de)分析(xi)和(he)實(shi)操示(shi)例能(neng)為廣大用戶帶來(lai)(lai)啟發和(he)幫助,讓大家在實(shi)際項目中充(chong)分發揮 TDengine 的(de)優勢,實(shi)現更高效的(de)業務(wu)管理和(he)數據處理。
關于(yu) TDengine 流計算的(de)更詳細(xi)信息可查閱官方文檔:
作者 | 李(li)明軍
編輯 | 馬(ma)爾悅



























