Flink的窗口聚合操作(Time\Count Window)
窗口基本概念:Flink中的窗口是左闭右开的窗口
Flink认为批处理是流处理的一个特例,而窗口window就是从流处理到批处理的一个桥梁,通常来讲窗口就是用来将无线数据流转换为优先数据集,从而在优先数据集上进行操作的一种机制,在flink当中支持基于无限大(永久)窗口的集合操作以及特定窗口的集合操作。
在flink当中支持的窗口聚合主要分为2种:window Aggregate和Over Aggregate,window Aggregate只有当窗口结束时才会输出结果,window aggregate从整体上分为3种类型:Time Window、Count Cindow 和自定义Window,其中每一种Window从粒度上又细分为滚动窗口(tumbling windows)、滑动窗口(sliding windows)和Session回话窗口。
无界窗口案列说明:
package Flink_Window;import org.apache.flink.api.common.functions.FlatMapFunction;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.datastream.DataStreamSource;
import org.apache.flink.streaming.api.datastream.SingleOutputStreamOperator;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.util.Collector;//flink原生支持的无界和操作
public class SocketInfiniteWindow {public static void main(String[] args) throws Exception {StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();DataStreamSource<String> streamSource=env.socketTextStream("192.168.208.112",8821,"\n");DataStream<Tuple2<String,Integer>> windowCounts = streamSource.flatMap(new FlatMapFunction<String, Tuple2<String,Integer>>() {@Overridepublic void flatMap(String s, Collector<Tuple2<String, Integer>> collector) throws Exception {String[] split=s.split("\\W+");for(String word:split){collector.collect(Tuple2.of(word,1));}}});//原来基础上,不断进行聚合操作//进行聚合keyby,没有time,这就是Flink原生操作的无界窗口操作SingleOutputStreamOperator<Tuple2<String, Integer>> sum = windowCounts.keyBy(0).sum(1);sum.print();env.execute("SocketInfiniteWindow");}
}
有界窗口:
1、Time Window使用
Time Window是根据时间对数据流进行分组的,它支持滚动窗口(tumbling windows)、滑动窗口(sliding windows)和Session回话窗口。
2种使用方式:
timeWindow(Time.minutes(1)):表示滚动窗口的大小是1min,对每一分钟内的数据进行聚合计算,即每隔1min计算一下最近内的数据;timeWindow(Time.minutes(1).Time.seconds(30)):表示滑动窗口的大小为1min,滑动间隔30秒,即每隔30秒统计最近1min内的数据。
案列:
package Flink_Window;import org.apache.flink.api.common.functions.FlatMapFunction;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.datastream.DataStreamSource;
import org.apache.flink.streaming.api.datastream.SingleOutputStreamOperator;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.api.windowing.time.Time;
import org.apache.flink.util.Collector;//flink原生支持的无界和操作
public class SocketInfiniteWindow {public static void main(String[] args) throws Exception {StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();DataStreamSource<String> streamSource=env.socketTextStream("192.168.208.112",8821,"\n");DataStream<Tuple2<String,Integer>> windowCounts = streamSource.flatMap(new FlatMapFunction<String, Tuple2<String,Integer>>() {@Overridepublic void flatMap(String s, Collector<Tuple2<String, Integer>> collector) throws Exception {String[] split=s.split("\\W+");for(String word:split){collector.collect(Tuple2.of(word,1));}}});//原来基础上,不断进行聚合操作//进行聚合keyby,没有time,这就是Flink原生操作的无界窗口操作
// SingleOutputStreamOperator<Tuple2<String, Integer>> sum = windowCounts.keyBy(0).sum(1);
// sum.print();//有界滚动窗口(30秒计算一次)
// SingleOutputStreamOperator<Tuple2<String, Integer>> sum = windowCounts.keyBy(0).timeWindow(Time.seconds(30)).sum(1);
// sum.print();//有界滑动窗口(30秒计算一次)SingleOutputStreamOperator<Tuple2<String, Integer>> sum = windowCounts.keyBy(0).timeWindow(Time.seconds(30),Time.seconds(2)).sum(1);sum.print();env.execute("SocketInfiniteWindow");}
}
2、Count window使用
Count Window是根据元素的个数对数据流进行分组的,它支持滚动窗口(tumbling windows)、滑动窗口(sliding windows) 和Session回话窗口。
2种使用方式:
countWindow(100):表示滚动窗口的大小是100个元素,当窗口中填满100个元素的时候,就会对窗口进行计算,即没间隔100个元素计算一次countWindow(100,10):表示滑动窗口的大小是100个元素,滑动间隔为10个元素,也就是说每新增10各元素就会对前面100个元素计算一次。
案例:
package Flink_Window;import org.apache.flink.api.common.functions.FlatMapFunction;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.datastream.DataStreamSource;
import org.apache.flink.streaming.api.datastream.SingleOutputStreamOperator;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.api.windowing.time.Time;
import org.apache.flink.util.Collector;//flink原生支持的无界和操作
public class SocketInfiniteWindow {public static void main(String[] args) throws Exception {StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();DataStreamSource<String> streamSource=env.socketTextStream("192.168.208.112",8821,"\n");DataStream<Tuple2<String,Integer>> windowCounts = streamSource.flatMap(new FlatMapFunction<String, Tuple2<String,Integer>>() {@Overridepublic void flatMap(String s, Collector<Tuple2<String, Integer>> collector) throws Exception {String[] split=s.split("\\W+");for(String word:split){collector.collect(Tuple2.of(word,1));}}});//原来基础上,不断进行聚合操作//进行聚合keyby,没有time,这就是Flink原生操作的无界窗口操作
// SingleOutputStreamOperator<Tuple2<String, Integer>> sum = windowCounts.keyBy(0).sum(1);
// sum.print();//有界滚动窗口(30秒计算一次)
// SingleOutputStreamOperator<Tuple2<String, Integer>> sum = windowCounts.keyBy(0).countWindow(5).sum(1);
// sum.print();//有界滑动窗口(30秒计算一次)SingleOutputStreamOperator<Tuple2<String, Integer>> sum = windowCounts.keyBy(0).countWindow(5,2).sum(1);sum.print();env.execute("SocketInfiniteWindow");}
}
3、自定义window
可以分为2种:一种是基于key的window,一种是不基于key的window,2种使用方式:
.keyBy.window():属于基于key的window,会先对窗口中的数据进行分组,然后在计算;
.windowAll():属于不基于key的window,会对窗口中的所有数据进行聚合操作;
其实:有keyBy就是window,没有keyBy就是windowALl。
Time window和Count Window的源码,这俩个window本质上就是针对window的封装实现。
滚动窗口:
滚动窗口(TUMBLE)将每个袁旭分配到一个指定大小的窗口中,通常滚动窗口有一个固定的大小,窗口之间不会出现重叠;滑动窗口(HOP)不同于滚动窗口,窗口之间可以休闲重叠,对于滑动窗口来说,有俩个重要的参数:slide和size,size为窗口的大小,slide为每次窗口滑动的步长。
滚动窗口(tumbling windows):表示窗口内的数据没有重叠
Session会话;
案列分析:
Flink的窗口聚合操作(Time\Count Window)相关推荐
- Flink AggOperatorWholeWin 全窗口聚合函数
全窗口聚合函数(full window functions) 1.先把窗口所有数据收集起来 2.窗口关闭时,遍历所有数据 ProcessWindowFunction 全窗口函数相比累加窗口函数好的优势 ...
- Flink 滚动窗口、滑动窗口详解
1 滚动窗口(Tumbling Windows) 滚动窗口有固定的大小,是一种对数据进行"均匀切片"的划分方式.窗口之间没有重叠,也不会有间隔,是"首尾相接"的 ...
- Flink之窗口 (Window) 下篇
窗口函数(Window Functions) 定义了窗口分配器,我们只是知道了数据属于哪个窗口,可以将数据收集起来了:至于收集起来到底要做什么,其实还完全没有头绪.所以在窗口分配器之后,必须再接上一个 ...
- Flink之窗口 (Window) 上篇
我们已经了解了 Flink 中事件时间和水位线的概念,那它们有什么具体应用呢?当然是做基于时间的处理计算了.其中最常见的场景,就是窗口聚合计算. 之前我们已经了解了 Flink 中基本的聚合操作.在流 ...
- 【Flink】各种窗口的使用(处理时间窗口、事件时间窗口、窗口聚合窗口)
文章目录 一 Flink 中的 Window 1 Window (1)Window概述 (2) Window类型 a 滚动窗口(Tumbling Windows) b 滑动窗口(Sliding Win ...
- Flink窗口聚合案例(增量聚合、全量聚合)
上面我们time window和count window讨论了聚合,下面我们从另外一个角度对window进行分类,从聚合角度. window的集合操作分为2种:一种是增量聚合,一种时候全量聚合,增量聚 ...
- java Flink滚动时间窗口聚合TumblingProcessingTimeWindows运算例子
整个的思路是: 构造数据源 窗口聚合代码 1. 构造数据源 首先构造数据,新建一个MyData2.java的文件,写入这个MyData2的类 package create_data;import ja ...
- php数据group去重,MongoDB_Mongodb聚合函数count、distinct、group如何实现数据聚合操作, 上篇文章给大家介绍了Mong - phpStudy...
Mongodb聚合函数count.distinct.group如何实现数据聚合操作 上篇文章给大家介绍了Mongodb中MapReduce实现数据聚合方法详解,我们提到过Mongodb中进行数据聚合操 ...
- flink 自定义 窗口_《从0到1学习Flink》—— Flink Data transformation(转换)
前言 在第一篇介绍 Flink 的文章 <<从0到1学习Flink>-- Apache Flink 介绍> 中就说过 Flink 程序的结构 Flink 应用程序结构就是如上图 ...
最新文章
- ubuntu16.06+vsftpd+nginx搭建图片服务器
- 【Binder 机制】进程通信 | 用户空间与内核空间 | MMU 与虚拟内存地址
- LayoutInflater中调用系统服务
- c语言函数fread的调用形式,C语言的问题,fread和fgets的区别是什么?
- ASP.NET Core中使用IOC三部曲(二.采用Autofac来替换IOC容器,并实现属性注入)
- PHP - 图像处理
- 命令行部署程序保存pid到文件
- mysql中outer join用什么,mysql – “INNER JOIN”和“OUTER JOIN”有什么区别?
- 台达杯自动化大赛设计方案
- python unique函数_《Python编程从入门到实践》json数据可视化练习详解
- Firewalld防火墙转换成Iptables
- 给各位读者朋友们、热心访问本博客的朋友们的一份新年贺卡
- 制作网页中弹出对话框的制作
- LittleVGL v7.5.0在STM32F103x上的移植
- fadeOut和fadeIn
- 王者荣耀服务器维护什么时间结束,3月26日全服不停机更新公告
- 洛谷-P1424-小鱼的航程
- Tkinter 组件详解(十):Scale
- 任正非的忠告:不赚钱的产品就关闭压缩
- 关于升级win10 右键卡顿的解决方法
热门文章
- Eclipse的vim插件viPlugin的安装
- php下的jsonp使用实例
- 封装好的实用的读写XML类---增删改查XML
- C#生成CHM文件(应用篇)
- 学习笔记草稿版——体绘制中的光学模型
- Castle ActiveRecord学习实践(6):延迟加载和使用Where子句
- 国三计算机考试难度大吗,报考计算机技术在职研考试科目多吗考试难度大吗需要有计算机国三基础吗...
- python分布式框架celery项目开发_本项目在 Celery 分布式爬虫的基础上构建监控方案 Demo...
- 高清壁纸|是时候换换心情了
- 如何为活动设计海报|优秀案例,分享关键技巧