Flink/Blink 原理漫谈(四)window机制详解

系列文章目录

Flink/Blink 原理漫谈(零)运行时的组件

Flink/Blink 原理漫谈(一)时间,watermark详解

Flink/Blink 原理漫谈(二)流表对偶性和distinct详解

Flink/Blink 原理漫谈(三)state 有状态计算机制 详解

Flink/Blink 原理漫谈(四)window机制详解

Flink/Blink 原理漫谈(五)流式计算的持续查询实现 详解

Flink/Blink 原理漫谈(六)容错机制(fault tolerance)详解


文章目录

  • 系列文章目录
  • window机制
    • Group by window
      • Tumbling window 滑动窗口
      • Hop window 滑动窗口
      • Session window 会话窗口
    • OVER WINDOW
      • ROWS OVER Window
      • Range over window


window机制

Blink-1.x版本的window内容
有一些比较基本的group by概念我觉得不需要陈述了,主要需要介绍的是两个类型:group by window和over window。
Group by window中包含滚动窗口,滑动窗口,会话窗口;over window包含rows over window和range over window。

在开始介绍窗口之前,我想先进行一个总结:group by window都是仅仅支持时间窗口的(数据时间戳进行划分窗口),而over window支持时间窗口和计数窗口(按数据条数进行划分窗口),这个划分方式决定了在一些实际的业务问题上面,会产生很严重的影响,例如根据心跳日志实时计算上线人数和下线人数;如果使用group by window,flink自身的retract机制就会导致结果和预期不符,但是使用over window,问题就迎刃而解了。

Group by window

Tumbling window 滑动窗口

特点:左闭右开,窗口长度固定,无重叠。
Flink/Blink 原理漫谈(四)window机制详解_第1张图片
窗口语法:

SELECT 
    [gk],
    [TUMBLE_START(timeCol, size)], 
    [TUMBLE_END(timeCol, size)], 
    agg1(col1), 
    ... 
    aggn(colN)
FROM Tab1
GROUP BY [gk], TUMBLE(timeCol, size)

• [gk] 决定了流是Keyed还是/Non-Keyed;
• TUMBLE_START - 窗口开始时间;
• TUMBLE_END - 窗口结束时间;
• timeCol - 是流表中表示时间字段;
• size - 表示窗口的大小,如 秒,分钟,小时,天;

真实示例:

SELECT  
    region,
    TUMBLE_START(accessTime, INTERVAL '2' MINUTE) AS winStart,  
    TUMBLE_END(accessTime, INTERVAL '2' MINUTE) AS winEnd,  
    COUNT(region) AS pv
FROM taobao_page_access 
GROUP BY region, TUMBLE(accessTime, INTERVAL '2' MINUTE)

Hop window 滑动窗口

Flink/Blink 原理漫谈(四)window机制详解_第2张图片
窗口语法

SELECT 
    [gk], 
    [HOP_START(timeCol, slide, size)] ,  
    [HOP_END(timeCol, slide, size)],
    agg1(col1), 
    ... 
    aggN(colN) 
FROM Tab1
GROUP BY [gk], HOP(timeCol, slide, size)

• [gk] 决定了流是Keyed还是/Non-Keyed;
• HOP_START - 窗口开始时间;
• HOP_END - 窗口结束时间;
• timeCol - 是流表中表示时间字段;
• slide - 是滑动步伐的大小;
• size - 是窗口的大小,如 秒,分钟,小时,天;

真实示例

SELECT  
  HOP_START(accessTime, INTERVAL '5' MINUTE, INTERVAL '10' MINUTE) AS winStart,  
  HOP_END(accessTime, INTERVAL '5' MINUTE, INTERVAL '10' MINUTE) AS winEnd,  
  SUM(accessCount) AS accessCount  
FROM tmall_page_access 
GROUP BY HOP(accessTime, INTERVAL '5' MINUTE, INTERVAL '10' MINUTE)

Session window 会话窗口

一段时间无新数据就产生新的窗口
Flink/Blink 原理漫谈(四)window机制详解_第3张图片
窗口语法

SELECT 
    [gk], 
    SESSION_START(timeCol, gap) AS winStart,  
    SESSION_END(timeCol, gap) AS winEnd,
    agg1(col1),
     ... 
    aggn(colN)
FROM Tab1
GROUP BY [gk], SESSION(timeCol, gap)

• [gk] 决定了流是Keyed还是/Non-Keyed;
• SESSION_START - 窗口开始时间;
• SESSION_END - 窗口结束时间;
• timeCol - 是流表中表示时间字段;
• gap - 是窗口数据非活跃周期的时长;

真实示例

SELECT  
    region, 
    SESSION_START(accessTime, INTERVAL '3' MINUTE) AS winStart,  
    SESSION_END(accessTime, INTERVAL '3' MINUTE) AS winEnd,  
    COUNT(region) AS pv  
FROM page_access 
GROUP BY region, SESSION(accessTime, INTERVAL '3' MINUTE)

OVER WINDOW

OVER Window按照确定当前行的不同方式将OVER Window分成两类:
• ROWS OVER Window - 每一行元素都视为新的计算行,即,每一行都是一个新的窗口;
• RANGE OVER Window - 具有相同时间值的所有元素行,视为同一计算行,即,具有相同时间值的所有行都是同一个窗口;

ROWS OVER Window

Flink/Blink 原理漫谈(四)window机制详解_第4张图片
注意: 上图所示窗口 user 1 的 w7和w8, user 2的 窗口 w3 和 w4,虽然他们元素都是同一时刻到达,但是他们仍然是在不同的窗口,这一点有别于RANGE OVER Window.
• Bounded ROWS OVER Window 数据,以3个元素(2 PRECEDING)的窗口为例,如下图:
Flink/Blink 原理漫谈(四)window机制详解_第5张图片
注意: 上图所示窗口 user 1 的 w5和w6, user 2的 窗口 w2 和 w3,虽然有元素都是同一时刻到达,但是他们仍然是在不同的窗口,这一点有别于RANGE OVER Window.
窗口语法

SELECT 
    agg1(col1) OVER(
     [PARTITION BY (value_expression1,..., value_expressionN)] 
     ORDER BY timeCol
     ROWS 
     BETWEEN (UNBOUNDED | rowCount) PRECEDING AND CURRENT ROW) AS colName, 


FROM Tab1
• value_expression - 进行分区的字表达式;
• timeCol - 用于元素排序的时间字段;
• rowCount - 是定义根据当前行开始向前追溯几行元素;

真实示例

SELECT  
    itemID,
    itemType, 
    onSellTime, 
    price,  
    MAX(price) OVER (
        PARTITION BY itemType 
        ORDER BY onSellTime 
        ROWS BETWEEN 2 preceding AND CURRENT ROW) AS maxPrice
  FROM tmall_item

Range over window

Flink/Blink 原理漫谈(四)window机制详解_第6张图片
注意: 上图所示窗口 user 1 的 w7, user 2的 窗口 w3 ,两个元素同一时刻到达,他们属于相同的window,这一点有别于ROWS OVER Window.
• Bounded RANGE OVER Window 数据,以3秒中数据(INTERVAL ‘2’ SECOND)的窗口为例,如下图:

Flink/Blink 原理漫谈(四)window机制详解_第7张图片
注意: 上图所示窗口 user 1 的 w6, user 2的 窗口 w3,元素都是同一时刻到达,他们是在同一个窗口,这一点有别于ROWS OVER Window.
窗口语法

SELECT 
    agg1(col1) OVER(
     [PARTITION BY (value_expression1,..., value_expressionN)] 
     ORDER BY timeCol
     RANGE 
     BETWEEN (UNBOUNDED | timeInterval) PRECEDING AND CURRENT ROW) AS colName, 
... 
FROM Tab1

• value_expression - 进行分区的字表达式;
• timeCol - 用于元素排序的时间字段;
• timeInterval - 是定义根据当前行开始向前追溯指定时间的元素行;

真实示例

SELECT  
    itemID,
    itemType, 
    onSellTime, 
    price,  
    MAX(price) OVER (
        PARTITION BY itemType 
        ORDER BY onSellTime 
        RANGE BETWEEN INTERVAL '2' MINUTE preceding AND CURRENT ROW) AS maxPrice
  FROM tmall_item

你可能感兴趣的:(Flink/Blink,原理漫谈,flink,blink,实时大数据,大数据,sql)