在 TDengine 3.2.3.0 版本中,我們針對流式計算新增了計數(shù)窗口,進一步優(yōu)化了流式數(shù)據(jù)處理的能力。本文將為大家解讀流式計算與幾大窗口的關系,并針對新增的計數(shù)窗口進行詳細的介紹,幫助大家進一步了解時序數(shù)據(jù)庫 TDengine 流式計算,以便更好地進行應用。
什么是 TDengine 流計算?
流計算是一種數(shù)據(jù)處理方式,旨在實時處理和分析數(shù)據(jù)流,以便在數(shù)據(jù)到達時以極低的延遲生成結果。隨著物聯(lián)網(wǎng)(IoT)、大數(shù)據(jù)和實時分析需求的不斷增長,流計算在現(xiàn)代數(shù)據(jù)處理架構中變得愈發(fā)重要。TDengine 作為一款專為時序數(shù)據(jù)設計的數(shù)據(jù)庫,提供了強大的流計算能力,以滿足實時數(shù)據(jù)處理的需求。
隨著數(shù)據(jù)量的不斷增加,使用 SQL 語句進行查詢時,查詢的耗時可能會顯著增加。當查詢時間超過 5 秒時,用戶的人機交互體驗往往會受到影響。這種情況下,預先生成中間結果以加速查詢顯得尤為重要。盡管 TDengine 提供了多種預計算方法,但這些方法在靈活性上存在一定限制,特別是在定義計算窗口方面。因此,對于某些特定的查詢需求,流計算成為了一個更優(yōu)的選擇。
在實際應用中,流計算特別適合于大屏展示、即席查詢和實時告警等場景。這些場景通常要求快速響應,任何延遲都可能影響決策或用戶體驗。通過流計算,用戶可以將耗時較長的計算結果存儲到額外的結果表中,并在數(shù)據(jù)寫入時實時更新最近一個窗口的計算結果。這意味著用戶只需查詢數(shù)據(jù)量較小的結果表,就能夠快速獲取所需的計算結果,從而顯著提高了查詢效率和響應速度。
此外,雖然數(shù)據(jù)訂閱也可以達到類似流計算的效果,但這種方式需要用戶自己編寫數(shù)據(jù)訂閱程序。這不僅增加了開發(fā)的復雜性,還需要額外的機制來確保該程序的高可用性。例如,當程序意外重啟或遷移到其他節(jié)點時,需要能夠復用之前的計算狀態(tài),以防止數(shù)據(jù)丟失或計算中斷。因此,相比于數(shù)據(jù)訂閱,TDengine 的流計算提供了更為簡單和高效的解決方案,能夠更好地滿足實時數(shù)據(jù)處理的需求。
TDengine 流計算主要包括以下幾大特點:
基于事件訂閱
流計算采用事件驅動的方式,能夠輕松處理亂序數(shù)據(jù),確保數(shù)據(jù)處理的及時性和準確性。這種方式使得系統(tǒng)能夠在數(shù)據(jù)到達時立即進行處理,極大地降低了延遲。
多種窗口支持
TDengine 支持多種計算窗口,包括時間窗口、狀態(tài)窗口、會話窗口和計數(shù)窗口,并且支持滑動窗口。這種靈活的窗口設置使得用戶能夠根據(jù)業(yè)務需求,定義合適的計算范圍。
設備維度計算
流計算能夠按照設備維度進行計算,這意味著用戶可以針對特定設備的數(shù)據(jù)進行快速計算,降低了 CPU 的消耗,提高了效率。
TDengine 流式計算在許多方面優(yōu)于其他流計算框架,其中一個顯著的優(yōu)勢是它支持對歷史數(shù)據(jù)的計算。大多數(shù)流計算框架通常僅能處理從流計算創(chuàng)建時開始的數(shù)據(jù),這使得它們在分析長時間跨度的數(shù)據(jù)時受到限制。而 TDengine 則允許用戶對歷史數(shù)據(jù)進行計算,這對于需要回溯分析或綜合考慮歷史趨勢的場景來說極為重要。
此外,TDengine 還具備出色的過期數(shù)據(jù)處理能力。當窗口關閉后,其他框架可能無法有效處理過期數(shù)據(jù),而 TDengine 則能夠從時序數(shù)據(jù)存儲引擎中查找窗口的歷史數(shù)據(jù),并重新計算以獲得準確的結果。這種能力確保在窗口關閉之后,用戶仍然可以獲得完整和精確的數(shù)據(jù)分析,從而提升了數(shù)據(jù)處理的可靠性和準確性。
讀到這里,如果你想要進行基于 TDengine 的流式計算實操,可以參考官網(wǎng)提供的詳細教程:https://docs.taosdata.com/advanced/stream/。
什么是“窗口”?
窗口是一種數(shù)據(jù)處理機制,用于將無界的、連續(xù)的流數(shù)據(jù)劃分為有限的、可管理的部分。通過這種劃分,流計算引擎可以對每個窗口內(nèi)的數(shù)據(jù)進行聚合計算,從而生成有意義的統(tǒng)計信息。例如,我們可以計算某個時間段內(nèi)的平均值、總和、最大值或最小值等。
在數(shù)據(jù)處理領域,尤其是在流計算中,窗口是一個至關重要的概念。它用于將連續(xù)的時序數(shù)據(jù)拆分成有限大小的“存儲桶”,每個存儲桶中包含若干條記錄,對這些記錄進行聚合計算后,再將結果寫入到其他數(shù)據(jù)表中。這種拆分方式使得我們能夠對數(shù)據(jù)進行有效的處理和分析,尤其是在實時數(shù)據(jù)流的情況下。
在流計算中,如果不設置窗口,計算操作通常只能使用標量函數(shù)。標量函數(shù)是指作用于單個值的函數(shù),例如求平方、取絕對值等。這意味著在沒有窗口的情況下,無法進行復雜的數(shù)據(jù)聚合和統(tǒng)計分析。而窗口的引入,使得我們能夠在實時數(shù)據(jù)流中進行更加復雜的聚合計算,從而提升流計算的能力和靈活性。
在 TDengine 中,窗口主要有以下幾種不同的類型:
1. 會話窗口:根據(jù)記錄的時間戳主鍵的值來確定是否屬于同一個會話。相同會話中的記錄時間戳之間的差異小于預設的會話間隔時,這些記錄被視為同一會話的一部分。
2. 狀態(tài)窗口:使用整數(shù)(布爾值)或字符串來標識產(chǎn)生記錄時候設備的狀態(tài)量。產(chǎn)生的記錄如果具有相同的狀態(tài)量數(shù)值則歸屬于同一個狀態(tài)窗口,數(shù)值改變后該窗口關閉
3. 時間窗口:時間窗口是根據(jù)時間段來劃分的,又可分為滑動時間窗口和翻轉時間窗口。滑動時間窗口會隨著時間的推移而動態(tài)更新,而翻轉時間窗口則是在固定時間段內(nèi)進行聚合。
4. 事件窗口:事件窗口根據(jù)開始條件和結束條件來劃定窗口,當 start_trigger_condition 滿足時則窗口開始,直到 end_trigger_condition 滿足時窗口關閉。
以及下文要著重介紹的在 3.2.3.0 版本中新增的計數(shù)窗口。在實際應用中,用戶可以根據(jù)需求將多種窗口類型組合使用,以實現(xiàn)更復雜的分析。

計數(shù)窗口詳解
計數(shù)窗口根據(jù)固定的數(shù)據(jù)行數(shù)進行劃分。默認情況下,數(shù)據(jù)首先按時間戳排序,然后根據(jù) count_val 的值將數(shù)據(jù)分成多個窗口,并進行聚合計算。count_val 表示每個窗口中包含的最大數(shù)據(jù)行數(shù)。如果總數(shù)據(jù)行數(shù)不能被 count_val 整除,則最后一個窗口的行數(shù)將小于 count_val。sliding_val 是一個常量,表示窗口滑動的數(shù)量,類似于 interval 的滑動窗口概念。
window_clause: { SESSION(ts_col, tol_val) | STATE_WINDOW(col) | INTERVAL(interval_val [, interval_offset]) [SLIDING (sliding_val)] [FILL(fill_mod_and_val)] | EVENT_WINDOW START WITH start_trigger_condition END WITH end_trigger_condition | COUNT_WINDOW(count_val[, sliding_val]) }
以下面的 SQL 語句為例,計數(shù)窗口切分如圖所示:
select _wstart, _wend, count(*) from t count_window(4);

計數(shù)窗口在許多場景中具有重要應用。例如,在公路收費站,每當一輛車通過時,系統(tǒng)便會生成一條記錄,通過計數(shù)窗口可以實時監(jiān)測和顯示車輛的密集程度。這種實時數(shù)據(jù)分析有助于管理交通流量,優(yōu)化收費站的運營效率,確保道路暢通。
另一個典型應用是在生產(chǎn)制造車間。每當生產(chǎn)出 100 件設備,就會形成一個新的批次,此時可以利用計數(shù)窗口統(tǒng)計該批次的各種參數(shù),如環(huán)境溫度和生產(chǎn)速度。這種數(shù)據(jù)的實時采集與分析,不僅能提高生產(chǎn)過程的透明度,還能幫助管理人員及時調(diào)整生產(chǎn)策略,確保產(chǎn)品質量與生產(chǎn)效率。
以公路收費站進行如下應用示例:
CREATE STREAM stream_name TRIGGER at_once IGNORE EXPIRED 1 IGNORE UPDATE 0 WATERMARK 100s INTO stream_stb_name AS SELECT _wstart AS ts, count(*) c1, sum(b), max(c) FROM st PARTITION BY tbname, ta, a COUNT_WINDOW(9);
如果你想了解關于更多窗口的應用實例,可以查閱官方文檔:https://docs.taosdata.com/reference/taos-sql/distinguished/#%E8%AE%A1%E6%95%B0%E7%AA%97%E5%8F%A3
結語
通過本文,可以看到流式計算與窗口機制之間的密切關系。計數(shù)窗口的引入為用戶提供了更靈活、高效的數(shù)據(jù)處理能力,使得在實時數(shù)據(jù)分析中能夠獲得更好的性能表現(xiàn)。希望本文能幫助你更好地理解并應用 TDengine 的流計算功能,歡迎大家體驗。



互聯(lián)網(wǎng).png)



-1.png)












伙伴.png)



