Flink-窗口函数

声明:本文分享内容,纯属个人认知,如若看法不同,欢迎讨论进步

flink中时间概念:
  • Event Time(事件时间):每条数据或事件自带的时间属性,比如一条数据的创建时间。在高并发的情况下可能存在Event Time的到达为乱序的,即一个较早发生的数据延迟到达
  • Process Time(处理时间):Processing Time指算子使用当前机器的系统时钟时间,可以理解flink处理该条数据的时间
  • Ingestion Time(接入时间):事件到达Flink Source的时间
滚动窗口(TUMBLE):
  • 名词释义:将无限流数据划分为无限个区间段(严格按flink定义时间递增),相当于坐标轴的坐标,两个坐标中间就是一个滚动窗口,其中分布在时间在该区间的数据
  • 语       法:TUMBLE(ts, INTERVAL '3' MINUTE)    ts:flink 源表定义的时间字段,  INTERVAL '3' MINUTE:窗口尺寸(坐标的间隔) 

  • 示      例:统计每个用户每分钟在指定网站的单击数
CREATE TEMPORARY TABLE window_test (
  username   VARCHAR,
  click_url  VARCHAR,
  ts as PROCTIME()
) WITH (
  'connector'='sls',
  ...
);
CREATE TEMPORARY TABLE tumble_output(
  window_start TIMESTAMP,
  window_end TIMESTAMP,
  username VARCHAR,
  clicks BIGINT
) with (
  'connector'='datahub'
  ...
);
INSERT INTO tumble_output
SELECT
TUMBLE_START(ts, INTERVAL '1' MINUTE),
TUMBLE_END(ts, INTERVAL '1' MINUTE),
username,
COUNT(click_url)
FROM window_test
GROUP BY TUMBLE(ts, INTERVAL '1' MINUTE), username;
滑动窗口(HOP):
  • 名词释义:滑动窗口以一个步长(slide)不断向前滑动,窗口的长度固定。窗口可以重叠。窗口有两个参数:slide和size。slide为每次滑动的步长,size为窗口的大小
  • slide < size,则窗口会重叠,每个元素会被分配到多个窗口。
  • slide = size,等同于滚动窗口。
  • slide > size,则为跳跃窗口,窗口之间不重叠且有间隙。
  • 语       法:HOP(ts, INTERVAL '30' SECOND,  INTERVAL '1' MINUTE)    1分钟的窗口,30秒滑动一次 

  • 示     例:统计每个用户过去1分钟的单击次数,每30秒更新1次,即1分钟的窗口,30秒滑动1次。
CREATE TEMPORARY TABLE user_clicks (
  username VARCHAR,
  click_url VARCHAR,
  eventtime VARCHAR,                            
  ts AS TO_TIMESTAMP(eventtime),
  WATERMARK FOR ts AS ts - INTERVAL '2' SECOND  --为Rowtime定义Watermark。
) with (
  'connector'='sls',
  ...
);
CREATE TEMPORARY TABLE hop_output (
  window_start TIMESTAMP,
  window_end TIMESTAMP,
  username VARCHAR,
  clicks BIGINT
) with (
  'connector'='datahub'           --目前SLS只支持输出VARCHAR类型的DDL,所以使用DataHub存储。
  ...
);
INSERT INTO
    hop_output
SELECT
    HOP_START (ts, INTERVAL '30' SECOND, INTERVAL '1' MINUTE),
    HOP_END (ts, INTERVAL '30' SECOND, INTERVAL '1' MINUTE),
    username,
    COUNT (click_url)
FROM
    user_clicks
GROUP BY
    HOP (ts, INTERVAL '30' SECOND, INTERVAL '1' MINUTE),username;
会话窗口(SESSION):
  • 名词释义:会话窗口根据Session gap切分不同的窗口,当一个窗口在大于Session gap的时间内没有接收到新数据时,窗口将关闭。在这种模式下,窗口的长度是可变的,每个窗口的开始和结束时间并不是确定的
  • 语     法:SESSION(ts, INTERVAL '30' SECOND),超时时间为30秒的会话窗口
  • 示      例:统计每个用户在每个活跃会话期间的单击次数,会话超时时长为30秒
CREATE TEMPORARY TABLE user_clicks(
  username varchar,
  click_url varchar,
  eventtime varchar,                            
  ts AS TO_TIMESTAMP(eventtime),
  WATERMARK FOR ts AS ts - INTERVAL '2' SECOND  --为Rowtime定义Watermark。
) with (
  'connector'='sls',
  ...
);
CREATE TEMPORARY TABLE session_output(
  window_start TIMESTAMP,
  window_end TIMESTAMP,
  username VARCHAR,
  clicks BIGINT
) with (
  'connector'='datahub'
  ...
);
INSERT INTO session_output
SELECT
SESSION_START(ts, INTERVAL '30' SECOND),
SESSION_END(ts, INTERVAL '30' SECOND),
username,
COUNT(click_url)
FROM user_clicks
GROUP BY SESSION(ts, INTERVAL '30' SECOND), username;

 

posted @ 2023-08-09 15:37  梦呓空间  阅读(47)  评论(0编辑  收藏  举报