Flink/Blink 原理漫谈(零)运行时的组件
Flink/Blink 原理漫谈(一)时间,watermark详解
Flink/Blink 原理漫谈(二)流表对偶性和distinct详解
Flink/Blink 原理漫谈(三)state 有状态计算机制 详解
Flink/Blink 原理漫谈(四)window机制详解
Flink/Blink 原理漫谈(五)流式计算的持续查询实现 详解
Flink/Blink 原理漫谈(六)容错机制(fault tolerance)详解
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,问题就迎刃而解了。
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)
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)
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分成两类:
• ROWS OVER Window - 每一行元素都视为新的计算行,即,每一行都是一个新的窗口;
• RANGE OVER Window - 具有相同时间值的所有元素行,视为同一计算行,即,具有相同时间值的所有行都是同一个窗口;
注意: 上图所示窗口 user 1 的 w7和w8, user 2的 窗口 w3 和 w4,虽然他们元素都是同一时刻到达,但是他们仍然是在不同的窗口,这一点有别于RANGE OVER Window.
• Bounded ROWS OVER Window 数据,以3个元素(2 PRECEDING)的窗口为例,如下图:
注意: 上图所示窗口 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
注意: 上图所示窗口 user 1 的 w7, user 2的 窗口 w3 ,两个元素同一时刻到达,他们属于相同的window,这一点有别于ROWS OVER Window.
• Bounded RANGE OVER Window 数据,以3秒中数据(INTERVAL ‘2’ SECOND)的窗口为例,如下图:
注意: 上图所示窗口 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