欢迎关注公众号——《数据三分钟》
一线大厂的师兄师姐结合自己的工作实践,将数据知识浅显道来,每天三分钟,助你成为数据达人。还有面试指导和内推机会。
上一节将到标准开窗函数在实时流计算中的实现,这一节我们来讲讲window aggregate。我把这两块都放在窗口来写,因为他们本质都是一种计算的触发机制,即在满足一定情况下去启动需要的计算。不同的是window agg被定义在group by语句中,它定义出一个key,其实就是一个窗口的范围了。window agg还可以形象地看成一个一个按照一定规则排列的桶(bucket),而每一个桶就是一个window,就是一个计算单元。
window agg一般可以分为滑动窗口、滚动窗口、会话窗口。
1、滚动窗口(Tumble window)
滚动窗口彼此之间没有重叠,且严丝合缝,窗口与窗口之间连续分布。假设划定一个2分钟的滚动窗口,那么窗口的分布大致如下:
从上图可以看出每隔2分钟会触发一次滚动窗口。在window agg聚合中,我们通常要考虑数据的乱序和延迟问题,因此一般会搭配watermark(水印)去使用(后续章节会详细描述),假设我们需要计算每个商品每分钟的曝光次数,允许有3秒钟的数据延迟,代码如下:
CREATE TABLE tumble_window(
item_id varchar,
item_url varchar,
ts timeStamp,
WATERMARK wk FOR ts as withOffset(ts, 3000)
) with (
type='kafka',
...
);
CREATE TABLE tumble_result(
window_start TIMESTAMP,
window_end TIMESTAMP,
item_id VARCHAR,
exps BIGINT
) with (
type='hbase'
);
INSERT INTO tumble_result
SELECT
start_time(ts, INTERVAL '1' MINUTE),
end_time(ts, INTERVAL '1' MINUTE),
item_id,
COUNT(item_url) as cnt
FROM tumble_window
GROUP BY TUMBLE(ts, INTERVAL '1' MINUTE), item_id
测试数据:
item_id |
item_url |
ts |
item_1 |
http://taobao.com/123456 |
2021-06-18 12:00:00 |
item_1 |
2021-06-18 12:00:48 |
|
item_1 |
2021-06-18 12:00:58 |
|
item_1 |
2021-06-18 12:01:01 |
|
item_1 |