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)窗口