Window
- 聚合事件 (比如 计数、求和)在流上的工作方式与批处理不同
- 比如,对流中的所有元素进行计数是不可能的,因为通常流量是无限的。所以,流上的聚合需要由window来划定范围,比如“计算过去的5分钟”,或者“最后的100各元素的和”
- window 是一种可以把无限数据切割为有限数据块的手段
- 窗口可以是事件驱动的【Time Window】 比如:每30秒 或者数据驱动的【Count Window】 比如 :每100个元素
Window的类型
- tumbling windows:滚动窗口【没有重叠】
每个window 窗口大小是相等的
- sliding windows:滑动窗口【有重叠】
- session windows: 会话窗口
window类型汇总
TimeWindow的应用
.timeWindow(Time.seconds(2),Time.seconds(1)) // 滑动窗口 每个1秒 统计 2秒内的数据
.timeWindow(Time.seconds(2)) // 滚动窗口 统计2秒内的数据
CountWindow的应用
.countWindow(100) // 滚动窗口 对每隔100个元素 计算一次
.countWindow(100,10) // 滑动窗口 每隔10个元素 统计 最近100个元素
Window 聚合分类之增量聚合
- 增量聚合
- 窗口中每进入一条数据,就进行一次计算
- reduce(reduceFunction)
- aggregate(aggregateFunction)
- sum(),min(),max()
Window 聚合分类之全量聚合
- 全量聚合
- 等属于窗口的数据到齐,才开始进行聚合计算【可以实现对窗口内的数据进行排序等需求】
- apply(windowFunction)
- process(processWindowFunction)
- processWindowFunction比windowFunction提供了更多的上下文信息
package com.im.flink.task.Streaming;
import org.apache.flink.api.common.functions.MapFunction;
import org.apache.flink.api.java.tuple.Tuple;
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.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.api.functions.windowing.ProcessWindowFunction;
import org.apache.flink.streaming.api.windowing.time.Time;
import org.apache.flink.streaming.api.windowing.windows.TimeWindow;
import org.apache.flink.util.Collector;
import java.util.ArrayList;
/**
* describe:
*
* @author lm
* @date 20