本文开头附:Flink 学习路线系列 ^ _ ^
在之前,已经介绍完了 Flink 开发过程中相关算子 Transformation 的介绍。链接如下:Flink笔记(十):Flink常用算子Transformation介绍。
我们也介绍了 Flink 的 Time 和 Window 相关概念。链接如下:Flink笔记(十三):Flink 中 Time 和 Window 介绍。
接下来我们来了解一下 Flink 中 Window 窗口下相关算子的使用
。你也可以参考:Flink官方文档,来了解 Window 窗口相关算子的使用。
Window常用算子介绍
1.apply()
使用介绍:
使用 apply() 方法,可以满足我们对窗口中数据的灵活操作。
类型转换:
WindowedStream→DataStream
AllWindowedStream→DataStream
场景:
读取 Socket 端口中传入的数据,使用滚动窗口模式,5s 为一个窗口进行滚动求和计算。(本可以使用 Flink 为我们提供的 .sum() 方法实现。本例使用 apply() 方法来实现,使用 apply() 方法可以满足我们对窗口中数据的操作更加灵活
)
代码:
/**
* TODO 使用 Window 窗口的 apply 方法,实现一个 sum()求和方法
*
* @author liuzebiao
* @Date 2020-2-21 14:03
*/
public class WindowApplyDemo {
public static void main(String[] args) throws Exception {
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
DataStreamSource<String> streamSource = env.socketTextStream("localhost", 8888);
SingleOutputStreamOperator<Integer> intStream = streamSource.map(Integer::parseInt);
AllWindowedStream<Integer, TimeWindow> windowedStream = intStream.windowAll(TumblingProcessingTimeWindows.of(Time.seconds(5)));
/**1.通过 apply() 方法,实现一个sum() 求和的功能**/
SingleOutputStreamOperator<Integer> applyStream = windowedStream.apply(new AllWindowFunction<Integer, Integer, TimeWindow>() {
@Override
public void apply(TimeWindow timeWindow, Iterable<Integer> values, Collector<Integer> out) throws Exception {
int sum = 0;
for (Integer t : values) {
sum += t;
}
out.collect(sum);
}
});
/**2.使用.sum() 方法**/
// SingleOutputStreamOperator<Integer> applyStream = windowedStream.sum(0);
applyStream.print();
env.execute("WindowApplyDemo");
}
}
2.reduce()
使用介绍:
此 reduce() 方法为 Window 窗口操作下的 reduce() 方法。 通过 WindowedStrem.reduce()调用。
reduce():意为归并操作
。如果需要将数据流中的所有数据,归纳得到一个数据的情况,可以使用 reduce() 方法。如果需要对数据流中的数据进行求和操作
、求最大/最小值
等(都是归纳为一个数据的情况),此处就可以用到 reduce() 方法
reduce() 返回单个的结果值,并且 reduce 操作每处理一个元素总是会创建一个新的值。常用的聚合操作例如 min()、max() 等都可使用 reduce() 方法实现。Flink 中未实现的 average(平均值), count(计数)
等操作,也都可以通过 reduce()方法实现。
类型转换:
WindowedStream → DataStream
场景:
读取 Socket 端口中传入的数据,使用滚动窗口模式,5s 为一个窗口进行滚动,求平均值操作。
代码:
3.fold()
参考:Flink 关于 Window fold()方法官方文档
4.join()
参考:Flink Window中的 inner join、left join、right join
5.intervalJoin()
参考:Flink 关于 Window intervalJoin()方法官方文档
6.coGroup()
参考:Flink Window中的 inner join、left join、right join
本文没好好写,纯属凑数。哈哈。在草稿箱,整理时发现 Flink 学习路线系列少了 Flink笔记(二十五),才从草稿箱扒出来。谢谢大家的理解。