Apply实例

38 篇文章 0 订阅

构建数据源

package com.cnic.source;

import org.apache.flink.api.java.tuple.Tuple3;

import java.util.Arrays;
import java.util.List;

/**
 * @Description 公共示例数据
 */
public class DataSource {

    /**
     * 示例数据集合
     * Tuple3 是一个固定3个属性变量的实体类,分别用f0,f1,f2表示三个构造传参与变量
     * @return
     */
    public static List<Tuple3<String,String,Integer>> getTuple3ToList(){
        //Tuple3<f0,f1,f2> = Tuple3<姓名,性别(man男,girl女),年龄>
        return Arrays.asList(
                new Tuple3<>("张三", "man", 20),
                new Tuple3<>("李四", "girl", 24),
                new Tuple3<>("王五", "man", 29),
                new Tuple3<>("刘六", "girl", 32),
                new Tuple3<>("伍七", "girl", 18),
                new Tuple3<>("吴八", "man", 30)
        );
    }

}

主题代码:

package com.cnic.coding;

import com.cnic.source.DataSource;
import org.apache.flink.api.java.functions.KeySelector;
import org.apache.flink.api.java.tuple.Tuple3;

import org.apache.flink.streaming.api.datastream.SingleOutputStreamOperator;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.api.functions.windowing.WindowFunction;
import org.apache.flink.streaming.api.windowing.windows.GlobalWindow;
import org.apache.flink.util.Collector;

import java.util.Iterator;
import java.util.List;

/**
 * Apply:对窗口内的数据流进行处理
 */
public class Apply {
    public static void main(String[] args) throws Exception {
        /***
         * 遍历集合,分别打印不同性别的总人数与年龄之和
         */
        // 创建执行环境
       final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
       env.setParallelism(1);
        List<Tuple3<String, String, Integer>> tuple3List = DataSource.getTuple3ToList();
        SingleOutputStreamOperator<String> dataStream = env.fromCollection(tuple3List)
                .keyBy((KeySelector<Tuple3<String, String, Integer>, String>) k -> k.f1)
                // 按数量窗口滚动,每3个输入窗口数据流,计算一次
                .countWindow(3)
                // appley只能基于windowed窗口Stream进行调用
                .apply(
                        // WindowFunction<IN,OUT,KEY,W extends Window>
                        new WindowFunction<Tuple3<String, String, Integer>, String, String, GlobalWindow>() {
                            /**
                             * 处理窗口数据集合
                             * @param s 从keyBy里面返回的key值
                             * @param window 窗口类型
                             * @param input 从窗口获取的所有分区数据流
                             * @param out 输出数据流对象
                             * @throws Exception
                             */
                            @Override
                            public void apply(String s, GlobalWindow window, Iterable<Tuple3<String, String, Integer>> input, Collector<String> out) throws Exception {
                                Iterator<Tuple3<String, String, Integer>> iterator = input.iterator();
                                int total = 0;
                                int i = 0;
                                while (iterator.hasNext()) {
                                    Tuple3<String, String, Integer> tuple3 = iterator.next();
                                    total += tuple3.f2;
                                    i++;
                                }
                                out.collect(s + "共:" + i + "人,累计总年龄:" + total);

                            }
                        });

        dataStream.print();
        env.execute("flink Filter job");


    }
}

打印结果:

girl共:3人,累计总年龄:74
man共:3人,累计总年龄:79

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cts618

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值