flink中支持多种窗口,包括:时间窗口,session窗口,统计窗口等等,能想到的基本都可以实现

时间窗口(Time Windows)
最简单常用的窗口形式是基于时间的窗口,flink支持三种种时间窗口:

第一个: 翻滚时间窗口(tumbling time window)

翻滚时间窗口的窗口是固定的,比如设定一个1分钟的时间窗口,该时间窗口将只计算当前1分钟内的数据,而不会管前1分钟或后1分钟的数据。
时间是对齐的,数据不会同时出现在2个窗口内,不会重叠

第二个:滑动时间窗口(sliding time window)

滑动窗口,顾名思义,该时间窗口是滑动的。所以,从概念上讲,这里有两个方面的概念需要理解:

窗口:需要定义窗口的大小
滑动:需要定义在窗口中滑动的大小,但理论上讲滑动的大小不能超过窗口大小
滑动窗口是固定窗口的更广义的一种形式,滑动窗口由固定的窗口长度和滑动间隔组成
窗口长度是固定的,可以有重叠的部分

第三个: 会话窗口(Session Windows)

由一系列事件组合一个指定时间长度的timeout间隙组成,也就是一段时间没有接收到新数据就会生成新的窗口
主要特点就是: 时间无对齐

window() 方法接收的输入参数是一个WindowAssignerWindowAssigner 负责将每条输入的数据分发到正确的window中Flink提供了通用的WindowAssigner
滚动窗口(tumbling window)
滑动窗口(sliding window)
会话窗口(session window)
全局窗口(global window)创建不同类型的窗口滚动时间窗口(tumbling time window)
timeWindow(Time.seconds(15))
滑动时间窗口(sliding time window)
.timeWindow(Time.seconds(15),Time.seconds(5))会话窗口(session window)
.window(EventTimeSessionWindows.withGap(Time.minutes(10))窗口函数(window function)
window function 定义了要对窗口中收集的数据做的计算操作,可以分为两类;
增量聚合函数(incrementalggergation functions)
每条数据来了就会进行计算,保持一个简单的状态
ReduceFunction, AggregateFunction
全窗口函数(full windowfunctions)
先把窗口所有数据收集起来,等到计算的时候会遍历所有数据
ProcessWindowFunction其他一些常用的API
.trigger()---------触发器
定义window什么时候关闭,触发计算并输出结果
.evicotr()---------移除器
定义移除某些数据的逻辑
.allowedLateness()   ------允许处理迟到的数据
.sideOutputLateData() -----将迟到的数据放入侧输出流
.getSideOutput() ----获取侧输出流

理论说半天其实还是萌的,上个栗子

假设从文件读一批数据,每15秒统计一次,获取窗口内各传感器所有温度的最小值,以及最小的时间戳

新建一个scala Object WindowTest.scala

package com.mafei.apitestimport com.mafei.sinktest.SensorReadingTest5
import org.apache.flink.api.common.functions.ReduceFunction
import org.apache.flink.streaming.api.scala.{StreamExecutionEnvironment, createTypeInformation}
import org.apache.flink.streaming.api.windowing.time.Timeobject WindowTest {def main(args: Array[String]): Unit = {//创建执行环境val env = StreamExecutionEnvironment.getExecutionEnvironment
//    env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime)  //以事件时间作为窗口聚合
//env.setStreamTimeCharacteristic(TimeCharacteristic.IngestionTime)   //以数据进入flink的时间作为窗口时间
//    env.setStreamTimeCharacteristic(TimeCharacteristic.ProcessingTime) //以Flink实际处理时间作为窗口时间//如果发现没有输出,那可能是因为数据太少,不到15s都处理完成了,可以换成socket或者kafka来进行测试val inputStream = env.readTextFile("/opt/java2020_study/maven/flink1/src/main/resources/sensor.txt")env.setParallelism(1)inputStream.print()//先转换成样例类类型val dataStream = inputStream.map(data => {val arr = data.split(",") //按照,分割数据,获取结果SensorReadingTest5(arr(0), arr(1).toLong, arr(2).toDouble) //生成一个传感器类的数据,参数中传toLong和toDouble是因为默认分割后是字符串类别})//每15秒统计一次,窗口内各传感器所有温度的最小值,以及最小的时间戳val resultStream = dataStream.map(data=>(data.id,data.temperature,data.timestamp)).keyBy(_._1) //按照二元组的第一个元素(id)分组
//      .window(TumblingEventTimeWindows.of(Time.seconds(15))) //滚动时间窗口
//      .window(SlidingProcessingTimeWindows.of(Time.seconds(15),Time.seconds(3))) //滑动时间窗口,15秒一个窗口,每次往后划3秒
//      .window(EventTimeSessionWindows.withGap(Time.seconds(15))) //会话窗口,超过15秒算下一个会话
//      .countWindow(15) //滚动计数窗口.timeWindow(Time.seconds(15))  //每15秒统计一次,滚动时间窗口
//      .minBy(1)  //第二个元素做最小值的统计,如果只是获取所有温度的最小值,直接用这个方法就可以了。。.reduce((curRes,newData)=>(curRes._1, curRes._2.min(newData._2),newData._3))resultStream.print()env.execute()}
}//上面reduce代码如果用这个自定义的方式也是一样可以实现,效果是一样的
class MyReducer extends ReduceFunction[SensorReadingTest5]{override def reduce(t: SensorReadingTest5, t1: SensorReadingTest5): SensorReadingTest5 =SensorReadingTest5(t.id, t1.timestamp,t.temperature.min(t1.temperature))
}

准备一个sensor.txt 放到指定目录下内容:

sensor1,1603766281,1
sensor2,1603766282,42
sensor3,1603766283,43
sensor4,1603766240,40.1
sensor4,1603766284,20
sensor4,1603766249,40.2

最终代码的结构,和运行效果

Flink从入门到真香(12、Flink一大利器-时间窗口)相关推荐

  1. Superset从入门到真香

    ​一 superset概述 1.1 官网 https://superset.apache.org/ 1.2 简介 Superset快速,轻巧,直观,并带有各种选项,使各种技能的用户都可以轻松浏览和可视 ...

  2. Spring Cache,从入门到真香

    点击↑上方↑蓝色"编了个程"关注我~ 每周至少一篇原创文章 这是本公众号的第 33 篇原创文章 荒腔走板 西湖 这是前两天我去西湖游玩的时候,玩到了夕阳西下的时间.于是我两就坐在西 ...

  3. 从入门到真香!java截取字符串前两位

    一.对Kafka的认识 1.Kafka的基本概念 2.安装与配置 3.生产与消费 4.服务端参数配置 二.生产者 1.客户端开发 必要的参数配置 消息的发送 序列化 分区器 生产者拦截器 2.原理分析 ...

  4. 监控神器:Prometheus 轻松入门,真香!

    点击关注公众号,实用技术文章及时了解 导语 :Prometheus是一个开源的完整监控解决方案,本文将从指标抓取到查询及可视化展示,以及最后的监控告警,对Prometheus做一个基本的认识. 一.简 ...

  5. Golang 高质量单测之 Table-Driven:从入门到真香

    一个开发人员,在不受外力胁迫的情况下 ,如何能自觉自愿写单测? 那必然是相信收益 > 成本.单测节省的未来修bug时间 > 写单测所花费的时间. 为了保证上述不等式成立,这边建议您考虑 t ...

  6. Apache Flink从入门到放弃——Flink简介(一)

    目 录 1. 计算引擎的发展历史 2. 什么是Flink 2.1 概念 2.2 什么是有界的数据流和无界数据流?什么是状态? 2.3 Fink的历史 2.4 Flink的特点 2.5 Flink的应用 ...

  7. Flink最锋利的武器:Flink SQL入门和实战 | 附完整实现代码

    作者 | 机智的王知无 转载自大数据技术与架构(ID: import_bigdata) 一.Flink SQL 背景 Flink SQL 是 Flink 实时计算为简化计算模型,降低用户使用实时计算门 ...

  8. 实时数仓入门训练营:实时计算 Flink 版 SQL 实践

    简介:<实时数仓入门训练营>由阿里云研究员王峰.阿里云高级产品专家刘一鸣等实时计算 Flink 版和 Hologres 的多名技术/产品一线专家齐上阵,合力搭建此次训练营的课程体系,精心打 ...

  9. Flink 最锋利的武器:Flink SQL 入门和实战带你了解NBA球星数据

    一.Flink SQL 背景 Flink SQL 是 Flink 实时计算为简化计算模型,降低用户使用实时计算门槛而设计的一套符合标准 SQL 语义的开发语言. 自 2015 年开始,阿里巴巴开始调研 ...

最新文章

  1. 王者归来!2020 年 5 月编程语言排行榜,Python竟然排老三
  2. Java对List对象进行排序
  3. CV之IG:图像生成(Image Generation)的简介、使用方法、案例应用之详细攻略
  4. 视觉SLAM学习--RGB-D SLAM学习(待完善)
  5. python精要(66)—类(3)-文档字符串,注释文档
  6. 蹭一波热度,对《青春有你2》109位漂亮小姐姐下手了
  7. html树状图右侧_树状图及制作方法(Excel 2016/Excel 2013)
  8. 【差分数组】Master of GCD
  9. Node.js 连接 MySQL 并进行数据库操作
  10. linux获取连续数组下标值,shell 数组,双层循环打印变量
  11. 【主席树】bzoj1112: [POI2008]砖块Klo
  12. java 中怎么比较两个时间相差的秒数
  13. WP7 页面事件触发顺序测试
  14. niceScroll.js
  15. Python3爬虫项目集:豆瓣电影排行榜top250
  16. java银行存款案例
  17. IPv4到IPv6的改造转换方案(上):IPv6和IPv4优势对比
  18. 使用ADB安装Apk到手机
  19. 钢笔墨水能否代替打印机墨水_uv打印机喷头波形和墨水关系
  20. 网站备案其实是服务器备案,国内服务器为什么需要备案?国外服务器备案吗?

热门文章

  1. 鸟枪换炮---IDEA
  2. 路由器连接路由器怎么设置
  3. 视频(mp4文件)批量转换成动图(gif文件)
  4. 虚拟机Linux忘记root密码的解决办法
  5. 这几款超实用办公神器,让你的工作省心省时又省力!
  6. 计算机电缆线对成缆系数,电线电缆的成缆系数是什么含义?
  7. laravel查询按照whereIn排序
  8. 基于微信小程序的todo番茄钟设计与实现源码
  9. java俄罗斯方块七中图形类_shell脚本俄罗斯方块--代码真正详解
  10. 数学公式div是什么意思