Flink笔记(二十五):Window相关算子介绍

本文开头附: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笔记(二十五),才从草稿箱扒出来。谢谢大家的理解。

发布了301 篇原创文章 · 获赞 66 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/lzb348110175/article/details/104422962