欢迎关注公众号——《数据三分钟》

一线大厂的师兄师姐结合自己的工作实践,将数据知识浅显道来,每天三分钟,助你成为数据达人。还有面试指导和内推机会。

上一节将到标准开窗函数在实时流计算中的实现,这一节我们来讲讲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

淘宝网 - 淘!我喜欢

2021-06-18 12:01:15

item_1

淘宝网 - 淘!我喜欢

2021-06-18 12:01:45

item_1

淘宝网 - 淘!我喜欢

2021-06-18 12:01:56

item_1

淘宝网 - 淘!我喜欢

2021-06-18 12:02:25

item_2

http://taobao.com/1234567

2021-06-18 12:02:26

输出结果:

start_time

end_time

item_id

cnt

2021-06-18 12:00:00

2021-06-18 12:01:00

item_1

3

2021-06-18 12:01:00

2021-06-18 12:02:00

item_1

4

2021-06-18 12:02:00

2021-06-18 12:03:00

item_1

1

item_2

1

2、滑动窗口(Hop window)

滑动窗口和滚动窗口不同在于,滑动窗口要设置两个参数,一个是窗口长度,一个是滑动步长。当滑动步长小于窗口长度时,窗口之间存在重叠;当滑动步长等于窗口长度时,滑动窗口就退化成了滚动窗口;当滑动步长大于窗口长度时,窗口之间就会存在间隙。滑动窗口如下图所示,表示的是一个4min窗口长度,滑动步长为1min的滑动窗口:

滑动窗口在实践中被经常使用到,譬如计算某网站最近一分钟被浏览次数最多的商品;统计最近10分钟最热门的航班,统计最近5分钟某传感器最大的测量值等等。假设我们还是需要计算每个商品最近1分钟的曝光次数,允许有3秒钟的数据延迟,每30s更新一次输出,代码如下:

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 HOP(ts, INTERVAL '30' SECOND, 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

淘宝网 - 淘!我喜欢

2021-06-18 12:01:15

item_1

淘宝网 - 淘!我喜欢

2021-06-18 12:01:45

item_1

淘宝网 - 淘!我喜欢

2021-06-18 12:01:56

item_1

淘宝网 - 淘!我喜欢

2021-06-18 12:02:25

item_2

http://taobao.com/1234567

2021-06-18 12:02:26

输出结果:

start_time

end_time

item_id

cnt

2021-06-18 11:59:30

2021-06-18 12:00:30

item_1

1

2021-06-18 12:00:00

2021-06-18 12:01:00

item_1

2

2021-06-18 12:00:30

2021-06-18 12:01:30

item_1

4

2021-06-18 12:01:00

2021-06-18 12:02:00

item_1

4

2021-06-18 12:01:30

2021-06-18 12:02:30

item_1

3

item_2

1

2021-06-18 12:02:00

2021-06-18 12:03:00

item_1

1

item_2

1

3、会话窗口(Session window)

会话窗口与前两个窗口相比,第一没有固定的窗口长度,第二没有窗口的重叠,它是根据数据元素的分布间隔进行窗口的切割的,一旦元素的间隔达到设定的长度就会触发窗口计算,下图表示为一个间隔时间2min的会话窗口,也就是说,两分钟没有新的数据元素就会触发窗口计算:

会话窗口特别适合监测活跃交互次数,假设我们要计算某一个商品的活跃曝光次数,会话间隔是30s:

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 SESSION(ts, INTERVAL '30' SECOND), 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

淘宝网 - 淘!我喜欢

2021-06-18 12:01:15

item_1

淘宝网 - 淘!我喜欢

2021-06-18 12:01:45

item_1

淘宝网 - 淘!我喜欢

2021-06-18 12:01:56

item_1

淘宝网 - 淘!我喜欢

2021-06-18 12:02:25

item_2

http://taobao.com/1234567

2021-06-18 12:02:26

输出结果如下:

start_time

end_time

item_id

cnt

2021-06-18 12:00:00

2021-06-18 12:00:30

item_1

1

2021-06-18 12:00:48

2021-06-18 12:01:45

item_1

5

2021-06-18 12:01:45

2021-06-18 12:02:56

item_1

3

item_2

1

4、插一段历史

吴王阖闾仔细阅读了孙武(《孙子兵法》作者)晋献的兵法十三篇,非常敬佩孙武,于是想试探一下他是否有真才实学,就把他诏进王宫,并给他180名宫女操练。孙武领命,将她们分为两队,指定两名吴王宠妃为队长,执黄旗前导。演练开始,队伍一片混乱。孙武严肃宣布:“没有讲清楚,是我为将的过错。”再次说明演练要求、列队动作以及军法纪律以后,进行演练,仍然混乱得很,如是者三。孙武为严肃军纪,要求处斩两名队长,吴王为两名妃子求情,孙子不许,坚持将两位妃子处斩,说到:“将在外,君命有所不受。”吴王无奈,只能痛失两位爱妃。这就是著名的“吴宫练兵”的故事。

Flink入门教程(四)——窗口(二)相关推荐

  1. Flink入门教程(三)——窗口(一)

     欢迎关注公众号--<数据三分钟> 一线大厂的师兄师姐结合自己的工作实践,将数据知识浅显道来,每天三分钟,助你成为数据达人.还有面试指导和内推机会. over window是传统数据库的标 ...

  2. Spring Boot入门教程(四十二):微信支付集成-H5支付

    分享一个朋友的人工智能教程.比较通俗易懂,风趣幽默,感兴趣的朋友可以去看看. 一:开发文档 场景介绍 H5支付是指商户在微信客户端外的移动端网页展示商品或服务,用户在前述页面确认使用微信支付时,商户发 ...

  3. origin如何将多个曲线放在一张图_Origin入门教程(十二):误差棒棒棒棒儿

    精选回顾 ◀ 干货满满!计算狗「模拟计算干货」汇总大放送,你想要的都在这里~ ◀ 免费干货丨测试狗透射电子显微镜(TEM)资料汇总「TEM全家福」,从入门 到精通! ◀ SCI论文写作大全来啦!助你早 ...

  4. 【OpenCV入门教程之十二】OpenCV边缘检测:Canny算子,Sobel算子,Laplace算子,Scharr滤波器合辑

    本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接: http://blog.csdn.net/poem_qianmo/article/details/25560901 作者:毛星云(浅墨) ...

  5. LittleVGL (LVGL)干货入门教程四之制作和使用中文汉字字库

    LittleVGL (LVGL)干货入门教程四之制作和使用中文汉字字库 前言: 阅读前,请确保你至少拥有以下条件: 已实现显示API(教程一已实现, 链接:LittleVGL (LVGL)入门教程一之 ...

  6. 《假如编程是魔法之零基础看得懂的Python入门教程 》——(二)魔法实习生第一步了解魔杖的使用

    学习目标 了解什么是开发环境 了解python语言的环境安装 了解python语言编程的编辑器工具 目录 第一篇:<假如编程是魔法之零基础看得懂的Python入门教程 >--(一)既然你选 ...

  7. Python+Opencv图像处理新手入门教程(四):视频内容的读取与导出

    一步一步来吧 上一节: Python+Opencv图像处理新手入门教程(三):阈值与二值化 1.Intro 今天这节我们主要看怎么利用opencv读取并处理视频中的内容. 2.VideoCapture ...

  8. 新手必备pr 2021快速入门教程「十二」PR导出高清视频

    PR2021快速入门教程,学完之后,制作抖音视频,vlog,电影混剪,日常记录等不在话下!零基础,欢迎入坑! 本节内容 视频剪辑成我们想要的样子后,接下来重要的一步,就是导出!但是"如何导出 ...

  9. sklearn快速入门教程:(二)线性回归

    文章目录 一.从本文起学会快速阅读和学习 二.线性回归的原理回顾及官方文档 三.官方文档的分析 四.举一反三 五.小结 一.从本文起学会快速阅读和学习 本来是想把关于快速阅读的说明写在前一节,但最后还 ...

最新文章

  1. [HAOI 2010]软件安装
  2. DL之MobileNet:MobileNet算法的简介(论文介绍)、架构详解、案例应用等配图集合之详细攻略
  3. 实用ExtJS教程100例-002:MessageBox的三种用法
  4. WCF中的ServiceHost初始化两种方式(宿主)
  5. 程序猿的爱情--2011-12-27
  6. mysql书籍知识点梳理3(数据与表)
  7. java计算机毕业设计中小学生错题管理系统源码+数据库+系统+lw文档+mybatis+运行部署
  8. GIBIT墨水屏电子桌牌助力某银行无纸化办公会议系统
  9. 如何用maxdos网刻,MAXDOS网刻教程(转)
  10. mac下bin格式文件解压
  11. 基本粒子群算法小结及算法实例(附Matlab代码)
  12. ACL国际计算机语言协会2019,干货 | 2019 AI 国际顶级学术会议一览表
  13. 【高数】变上限积分的等价无穷小替换
  14. js神秘的电报密码---哈弗曼编码
  15. 2022 最新 JCR正式发布全球最新影响因子名单(前600名)
  16. 6-4 选队长 (10 分)
  17. 稀疏表示和DOA估计的联系与区别(the link and the gap)
  18. JAVA中文显示乱码的原因
  19. 绝对布局(AbsoluteLayout)的简单使用
  20. 我的理想计算机英语小短文,我的理想英语小作文

热门文章

  1. Linux嵌入式学习过程
  2. Android定时相关
  3. java fckedit_fck编辑器的使用经典
  4. android 获取手机中应用运行的时长和次数
  5. outlook自定义快捷键_如何将名片模板应用于联系人并在Outlook 2013中对其进行自定义...
  6. 飞翔的小鸟1.0 JAVA
  7. 使用freemarker导出word并动态插入多张图片
  8. 汉诺塔问题详解 递归实现 C语言
  9. 51nod1820 长城之旅
  10. python中定义元组的符号_python 3 基础之元组tuple,详解