flink窗口的種類及詳述

flink窗口的種類及詳述:

滾動(dòng)窗口(tumblingwindow)將事件分配到長度固定且互不重疊的桶中。

實(shí)際案例:簡單且常見的分維度分鐘級(jí)別同時(shí)在線用戶數(shù)、總銷售額

Java設(shè)置語句:window(TumblingProcessingTimeWindows.of(Time.seconds(5)))

該語句為設(shè)置滾動(dòng)窗口的窗口時(shí)長為5秒鐘

sql設(shè)置語句:FROM TABLE(TUMBLE(

????????TABLE?source_table

????????,?DESCRIPTOR(row_time)

????????,?INTERVAL?'60'?SECOND))

Windowing TVF 滾動(dòng)窗口的寫法就是把 tumble window 的聲明寫在了數(shù)據(jù)源的 Table 子句中,即?TABLE(TUMBLE(TABLE source_table, DESCRIPTOR(row_time), INTERVAL '60' SECOND)),包含三部分參數(shù)。

第一個(gè)參數(shù)?TABLE source_table?聲明數(shù)據(jù)源表;第二個(gè)參數(shù)?DESCRIPTOR(row_time)?聲明數(shù)據(jù)源的時(shí)間戳;第三個(gè)參數(shù)?INTERVAL '60' SECOND?聲明滾動(dòng)窗口大小為 1 min


滑動(dòng)窗口:分配器將每個(gè)元素分配給固定窗口大小的窗口。與滾動(dòng)窗口分配器類似,窗口的大小由 window size 參數(shù)配置。還有一個(gè)window slide參數(shù)用來控制滑動(dòng)窗口的滑動(dòng)大小。因此,如果滑動(dòng)大小小于窗口大小,則滑動(dòng)窗口會(huì)重疊。在這種情況下,一個(gè)元素會(huì)被分配到多個(gè)窗口中。

實(shí)際案例:簡單且常見的分維度分鐘級(jí)別同時(shí)在線用戶數(shù),1 分鐘輸出一次,計(jì)算最近 5 分鐘的數(shù)據(jù)

java設(shè)置語句:window(SlidingProcessingTimeWindows.of(Time.seconds(10), Time.seconds(5)))

window size :窗口大小為 10秒鐘

window slide:窗口間隔為5秒鐘

sql設(shè)置語句:?hop(row_time,?interval?'1'?minute,?interval?'5'?minute)?

第一個(gè)參數(shù)為事件時(shí)間的時(shí)間戳;第二個(gè)參數(shù)為滑動(dòng)窗口的滑動(dòng)步長;第三個(gè)參數(shù)為滑動(dòng)窗口大小。


會(huì)話窗口:分配器通過活動(dòng)會(huì)話對(duì)元素進(jìn)行分組。與滾動(dòng)窗口和滑動(dòng)窗口相比,會(huì)話窗口不會(huì)重疊,也沒有固定的開始和結(jié)束時(shí)間。當(dāng)會(huì)話窗口在一段時(shí)間內(nèi)沒有接收到元素時(shí)會(huì)關(guān)閉。會(huì)話窗口分配器需要配置一個(gè)會(huì)話間隙,定義了所需的不活動(dòng)時(shí)長。當(dāng)此時(shí)間段到期時(shí),當(dāng)前會(huì)話關(guān)閉,后續(xù)元素被分配到新的會(huì)話窗口。

實(shí)際案例:計(jì)算每個(gè)用戶在活躍期間(一個(gè) Session)總共購買的商品數(shù)量,如果用戶 5 分鐘沒有活動(dòng)則視為 Session 斷開

設(shè)置語句:基于事件時(shí)間的會(huì)話窗口window(EventTimeSessionWindows.withGap(Time.minutes(10)))

基于處理時(shí)間的會(huì)話窗口

Java設(shè)置:window(ProcessingTimeSessionWindows.withGap(Time.minutes(10)))

會(huì)話間隙,不活動(dòng)時(shí)長為10秒鐘

sql設(shè)置:session(row_time, interval '5' minute)

Group Window Aggregation 中 Session 窗口的寫法就是把 session window 的聲明寫在了 group by 子句中

Session 窗口即支持?處理時(shí)間?也支持?事件時(shí)間。但是處理時(shí)間只支持在 Streaming 任務(wù)中運(yùn)行,Batch 任務(wù)不支持。


漸進(jìn)式窗口:在其實(shí)就是?固定窗口間隔內(nèi)提前觸發(fā)的的滾動(dòng)窗口,其實(shí)就是?Tumble Window + early-fire?的一個(gè)事件時(shí)間的版本。例如,從每日零點(diǎn)到當(dāng)前這一分鐘繪制累積 UV,其中 10:00 時(shí)的 UV 表示從 00:00 到 10:00 的 UV 總數(shù)。漸進(jìn)式窗口可以認(rèn)為是首先開一個(gè)最大窗口大小的滾動(dòng)窗口,然后根據(jù)用戶設(shè)置的觸發(fā)的時(shí)間間隔將這個(gè)滾動(dòng)窗口拆分為多個(gè)窗口,這些窗口具有相同的窗口起點(diǎn)和不同的窗口終點(diǎn)。

?應(yīng)用場(chǎng)景:周期內(nèi)累計(jì) PV,UV 指標(biāo)(如每天累計(jì)到當(dāng)前這一分鐘的 PV,UV)。這類指標(biāo)是一段周期內(nèi)的累計(jì)狀態(tài),對(duì)分析師來說更具統(tǒng)計(jì)分析價(jià)值,而且?guī)缀跛械膹?fù)合指標(biāo)都是基于此類指標(biāo)的統(tǒng)計(jì)(不然離線為啥都要累計(jì)一天的數(shù)據(jù),而不要一分鐘累計(jì)的數(shù)據(jù)呢)。

實(shí)際案例:每天的截止當(dāng)前分鐘的累計(jì) money(sum(money)),去重 id 數(shù)(count(distinct id))。每天代表漸進(jìn)式窗口大小為 1 天,分鐘代表漸進(jìn)式窗口移動(dòng)步長為分鐘級(jí)別

sql設(shè)置:FROM?TABLE(CUMULATE(

???????TABLE?source_table

???????,?DESCRIPTOR(row_time)

???????,?INTERVAL?'60'?SECOND

???????,?INTERVAL?'1'?DAY))

Windowing TVF 滾動(dòng)窗口的寫法就是把 cumulate window 的聲明寫在了數(shù)據(jù)源的 Table 子句中,即?TABLE(CUMULATE(TABLE source_table, DESCRIPTOR(row_time), INTERVAL '60' SECOND, INTERVAL '1' DAY)),其中包含四部分參數(shù):

第一個(gè)參數(shù)?TABLE source_table?聲明數(shù)據(jù)源表;第二個(gè)參數(shù)?DESCRIPTOR(row_time)?聲明數(shù)據(jù)源的時(shí)間戳;第三個(gè)參數(shù)?INTERVAL '60' SECOND?聲明漸進(jìn)式窗口觸發(fā)的漸進(jìn)步長為 1 min。第四個(gè)參數(shù)?INTERVAL '1' DAY?聲明整個(gè)漸進(jìn)式窗口的大小為 1 天,到了第二天新開一個(gè)窗口重新累計(jì)


全局窗口:分配器將具有相同 key 的所有元素分配給同一個(gè)全局窗口。僅當(dāng)我們指定自定義觸發(fā)器時(shí),窗口才起作用。否則,不會(huì)執(zhí)行任何計(jì)算,因?yàn)槿执翱跊]有我們可以處理聚合元素的自然結(jié)束的點(diǎn)(譯者注:即本身自己不知道窗口的大小,計(jì)算多長時(shí)間的元素)

window(GlobalWindows.create())


平時(shí)滑動(dòng)窗口用得比較多,其次是滾動(dòng)窗口

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容