flink(5) window

winodw操作主要两个步骤

窗口分配器window 窗口函数(reduce aggregate apply)

window类型

通过窗口分配器来决定,时间窗口还是计数窗口

通过窗口起止时间(个数)的定义,可以有滚动窗口,滑动窗口,会话窗口

窗口(window)

可以把无限的数据流进行切分,得到有限的数据集进行处理 得到有界流

窗口(window)就是将无限流切割为有限流的一种方式,它会将流数据分发到有限大小的桶bucket中进行分析

时间窗口(Time Window)

滚动时间窗口

滑动时间窗口

会话窗口

 

计数窗口(Count Window)

滚动次数窗口

滑动次数窗口

 

滚动时间窗口(tumbling  Windows) 把时间换成次数 就是滚动次数窗口 概念一样

y将数据依据固定的窗口长度对数据进行切分

时间对齐,窗口长度固定,没有重叠 每一个数据 只会属于一个窗口 窗口左闭右开 也就是正好在 分界时间的数据归右边的窗口

滑动窗口(Sliding Windos)把时间换成次数 就是滑动次数窗口 概念一样

滑动窗口是固定窗口的更广义的一种形式,滑动窗口由固定的窗口长度和滑动间隔组成

窗口长度固定,可以有重叠

会话窗口 (Session Windos)

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

特点:时间无对齐  就是 现在处理的 会话的概念

window API

窗口分配器-window()方法

我们可以用window()来定义一个窗口,然后基于这个window去做一些聚合或者其他处理操作。注意window()方法必须在keyBy之后才能用。

Flink 提供了 更加简单的.timeWindow和.countWindow方法,用于定义时间窗口和计数窗口。

val minPerWindo = dataStream
    .map(r=> (r.id,r.temperature))
    .keyBy(_._1)
    .timeWindow(Time.seconds(15))
    .reduce((r1,r2)=>(r1._1,r1._2.min(r2._2)))

window 方法  windowAll方法  区别

window 方法 是针对 keyBy后数据 做window  windowAll方式会把数据分区设置成一  也就是把所有的数据 发到同一分区

因此 可能 某一个分区 数据量过大 因此官方不推荐windowAll

timeWindow 和 countWindow 实际上底层 还是调用 window方法

window ()方法接收的输入参数是一个WindowAssigner

WindowAssigner负责将每条输入的数据分发到正确的window中

Flink提供了 通用的WindowAssigner

滚动窗口 tumbling window 滑动窗口 sliding window  会话窗口 session window 全局窗口 global window

最后一个 实际上 就是 为了自定义窗口 所提供的 需要自己定义触发器

timeWindow有两种方式 重载   一个形参 的 传入一个Time类型的参数 表示窗口大小  传入两个 分别是 大小 和滑动步长 成为滑动窗口

会话窗口 timeWindow 没直接实现 需要 通过window 方法

//滚动窗口
val resuletStream = dataStream 
    .keyBy("id")
    .timeWinow(Time.hours(1))
//滑动窗口
    .timeWinow(Time.hours(1),Time.minutes(1))

//这里使用event时间语义定义一个 sessionWindow
val resuletStream = dataStream 
    .keyBy("id")
    .window(EventTimeSessionWindos.withGap(Time.minutes(1))) //会话窗口

计数窗口 与 时间窗口 类似 只不过形参 直接传long类型 用countWindow() 方法调用

以上各种窗口 叫做window assigner 也就是把 数据 扔到各个桶

window assigner + window function = 才叫做一个完整的创库

window function 窗口函数

window function 定义了要对窗口中收集的数据做的计算操作

可以分为两类 

增量聚合函数 每条数据 到来就进行计算 ,保持一个简单的状态 ReduceFunction,Aggregate function

全窗口函数  先把窗口所有数据收集起来,等到计算的时候会遍历所有数据  windowFunction processwindowFunction

窗口函数是基于当前窗口内的数据的,是有界数据集的计算,通常只在窗口关闭时输出一次

def main(args: Array[String]): Unit = {
    val env = StreamExecutionEnvironment.getExecutionEnvironment
    val inputDataStream: DataStream[String] = env.socketTextStream("127.0.0.1", 9436)

    val dataStream = inputDataStream.map(data => {
      val dataArray = data.split(",")
      SensorReading(dataArray(0), dataArray(1).toLong, dataArray(2).toDouble)
    })
    //滚动窗口调用增量聚合函数
//    val resultStream = dataStream
//      .keyBy("id")
//      .timeWindow(Time.seconds(15))
//      .reduce(new MyReduce())

    //滑动窗口调用增量聚合函数
//    val resultStream = dataStream
//      .keyBy("id")
//      .timeWindow(Time.seconds(15),Time.seconds(5))
//      .reduce(new MyReduce())

    //滑动窗口调用全窗口计算函数
    val resultStream = dataStream
      .keyBy("id")
      .timeWindow(Time.seconds(15),Time.seconds(5))
      .apply(new MyWindowFunction())
    resultStream.print()
    env.execute(" window test")
  }

其他  window api 

trigger() 触发器 定义window 什么时候关闭,触发计算并输出结果   evictor 移除器 用来定义移除某些数据的逻辑

allowedLateness 允许处理迟到的数据

sideOutputLateData 将迟到的数据放入测输出流 

getSideOutput 获取侧输出流

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值