Flink中max和maxBy的区别及使用

在Flink流处理中,max算子用于找出每个分组的最大值,只更新最大值字段;而maxBy算子则会保存整个数据项,当找到更大值时更新整个记录。两者都是滚动聚合操作,但maxBy在更新时更全面。测试结果显示,max算子输出的最大值字段会变,其他不变,而maxBy算子会更新整条最大数据记录。
摘要由CSDN通过智能技术生成

在Flink中max算子和maxBy算子都是用来求取最大值的,下面将结合代码介绍一下它俩的相同点和不同点

  • 相同点

    1. 都是滚动聚合
    2. 都会根据代码的逻辑更新状态中记录的聚合值,并输出
  • 不同点

    1. max算子只会更新最大值的字段,maxBy算子会更新整条数据,下面就结合代码看和结果看一下相同点及区别
  • 测试数据

    小明,M,25
    小花,W,27
    小美,W,29
    小强,M,24
    小刚,M,29
    小A,M,25
    小B,W,27
    小C,W,29
    小D,M,24
    小E,M,29
    
  • max算子

    public static void main(String[] args) throws Exception {
        // 创建流处理环境
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        env.setParallelism(1);
        // 读取数据文件
        DataStreamSource<String> fileStreamSource = env.readTextFile("data/test/user.txt");
        // 现将数据转成Tuple3形式(名,性别,年龄)
        SingleOutputStreamOperator<Tuple3<String, String, Integer>> mapStream = fileStreamSource.map((MapFunction<String, Tuple3<String, String, Integer>>) value -> {
            // 切割字符串
            String[] split = value.split(",");
            // 将Tuple3返回
            return Tuple3.of(split[0], split[1], Integer.parseInt(split[2]));
        }).returns(new TypeHint<Tuple3<String, String, Integer>>() {});
        // 按照性别进行分组
        KeyedStream<Tuple3<String, String, Integer>, String> keyed = mapStream.keyBy(tup -> tup.f1);
        // 使用max算子求最大值
        SingleOutputStreamOperator<Tuple3<String, String, Integer>> maxStream = keyed.max(2);
        // 打印数据
        maxStream.print();
        env.execute();
    
  • 结果

    (小明,M,25)
    (小花,W,27)
    (小花,W,29)
    (小明,M,25)
    (小明,M,29)
    (小明,M,29)
    (小花,W,29)
    (小花,W,29)
    (小明,M,29)
    (小明,M,29)
    
  • maxBy算子

    public static void main(String[] args) throws Exception {
        // 创建流处理环境
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        env.setParallelism(1);
        // 读取数据文件
        DataStreamSource<String> fileStreamSource = env.readTextFile("data/test/user.txt");
        // 现将数据转成Tuple3形式(名,性别,年龄)
        SingleOutputStreamOperator<Tuple3<String, String, Integer>> mapStream = fileStreamSource.map((MapFunction<String, Tuple3<String, String, Integer>>) value -> {
            // 切割字符串
            String[] split = value.split(",");
            // 将Tuple3返回
            return Tuple3.of(split[0], split[1], Integer.parseInt(split[2]));
        }).returns(new TypeHint<Tuple3<String, String, Integer>>() {});
        // 按照性别进行分组
        KeyedStream<Tuple3<String, String, Integer>, String> keyed = mapStream.keyBy(tup -> tup.f1);
        // 使用maxBy算子求最大值
        SingleOutputStreamOperator<Tuple3<String, String, Integer>> maxStream = keyed.maxBy(2);
        // 打印数据
        maxStream.print();
        env.execute();
    }
    
  • 结果

    (小明,M,25)
    (小花,W,27)
    (小美,W,29)
    (小明,M,25)
    (小刚,M,29)
    (小刚,M,29)
    (小美,W,29)
    (小美,W,29)
    (小刚,M,29)
    (小刚,M,29)
    

通过上面的结果数据首先我们就能确认maxmaxBy两个算子都是滚动计算的.
我们再看不同点max算子计算的结果数据前面两个值始终没有发生变化(姓名,性别),变化的只有最后一个最大值,而maxBy算子则是整条数据都进行了更新,而且通过结果我们可以知道maxBy算子再获取最大值时,只有大于状态中记录的数据时才会更新整条数据,小于等于是不进行更新的.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值