hive 窗口函数_Flink的窗口类型详解

这是我的第87篇原创

a0992fa5ae8990fd82d00bf5d1433266.png

窗口函数真奇妙,聚合计算快又好,

数据分析宝中宝,表哥表妹不能少,不!能!少!

在我刚入行的时候,还不懂啥窗口函数,想出一张报表那叫一个费劲啊,各种自关联、行转列、列转行玩的不亦乐乎。

后来知道有个叫“窗口函数/聚合函数”的东西,简直把我惊呆了,感觉好几年的功夫都白练了。

之前给大家分享过Hive的窗口函数全解,点击查看:【面试必问】窗口函数全解-HIVE。

无限数据流的统计问题

今天给大家分享一下Flink的Windows。Hive的窗口函数其实跟MySQL的差不多,因为他们都是基于离线数据的聚合。Flink的windows和Hive的窗口函数不完全一样。

离线数据处理好理解,数据已经落地在一张表里,咱可以通过partition by,按照某个字段进行分区,通过order进行排序,通过between进行范围限定,然后通过LEAD、FIRST_VALUE等进行定位,最后通过sum、avg等聚合函数进行计算。这就像计算图片中有多少个植物一样清晰明了。实在不行,咱硬数也是能行的。

581057c804b615a54b3b5451b070d1a5.png

但是Flink里的数据是个流,数据压根就不会落地,这咋进行计算啊?这是一个“无限游戏”啊!好比你得算一下植物大战僵尸里被射出多少颗豌豆子弹一样。非要计算,就只能永远计算一个不断增大的累计数而已。

631a4be111b562f1284a4cf79029a0fe.png

除非咱能像截图一样,让数据停下来,然后咱再一颗一颗去数,否则根本没法算清楚范围内有多少颗豌豆子弹。这根本没法分析啊!

Flink的窗口类型

Flink是怎么解决这个问题的呢?很简单,设置一个固定的观察窗口,不停的计算窗口内的豌豆子弹数就可以了。这样就把无限数据流,变成有限数据块了。这样问题就解决了。

80242531745caeec86b4a756af16fa24.png

但是,有个问题,怎么划分窗口的范围呢?也就是说,如何切割窗口呢?几个办法:

1、用时间切割窗口,每过N秒记为一个window,即TimeWindow;

729a372923a630db4f7e2c043e972e4a.png

2、用数据量切割窗口,每N个数据记为一个window,即CountWindow;

1af7961fca677cdf921998267c53dfc1.png

3、用session切割窗口,数据流中断N秒记为一个window,即Sessionwindow;

5e2ce0cfecd7bf525aec9ae714a44936.png

4、不限定,从一开始到现在不断累计计算,即global window。这种状态下,Flink并行度只能为1。

95609fcfc430d8b1135369ea8ecb85ec.png

另外,对于TimeWindow和CountWindow,分别还有两种细分类型:滚动窗口和滑动窗口。

滚动窗口就是一个固定区间(时间或者数量),不断滚动,区间严格分离,不会重复。

729a372923a630db4f7e2c043e972e4a.png

1af7961fca677cdf921998267c53dfc1.png

滑动窗口顾名思义,就是窗口区间是可以拖动的,所以会重复。

a52cca16913f462e04bd6c3163f62d72.png

对了,针对数据本身,Flink还设置了keyed和non keyed两种windows,这是为了后续处理用的。其实就是解决你是否要区分子弹类型的:

f643b61953d1cdab4238224c9d8995ac.png

如果用了keyed windows,Flink会把相同key的数据发送到同一个task里进行处理,这样并行度就高了。

如果用了Non Keyed Windows,那么所有数据都会放在一个task里操作,并行度也就只能为1了。

总结一下,Flink的窗口按切割方式、是否有key值、滑动还是滚动三个维度,分为以下几种情况:

af4c2d66077434bf833535acdb3ff664.png

基本上这些窗口就能满足所有业务需求了。

下次再分享Flink窗口的其他内容~~~

配合以下文章享受更佳

【详解】 | Flink的Checkpoints机制详解

【详解】 |  MapReduce环形缓冲区

【详解】 |  分布式一致性协议-Paxos

我需要你的点赞,爱你哟8ff52f905269630b25fbce6103345714.gif
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值