关于Flink max、maxby区别

关于Flink max、maxby区别

同理,min,minby

  • max返回最大值
  • maxBy 把最大值对应的元素全部返回

举例说明:


	import org.apache.flink.api.java.functions.KeySelector;
	import org.apache.flink.api.java.tuple.Tuple3;
	import org.apache.flink.streaming.api.datastream.DataStreamSource;
	import org.apache.flink.streaming.api.datastream.KeyedStream;
	import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
	
	import java.util.ArrayList;
	import java.util.List;
	
	/**
	 * @Title: TSource
	 * @Description: TSource
	 * @Author: 
	 * @Date: 2021/1/13
	 */
	public class TSource {
	
	    public static void main(String[] args) throws Exception {
	
	        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
	
	        List list = new ArrayList<Tuple3<Integer, Integer, String>>();
	        list.add(new Tuple3<>(0, 1, "a"));
	        list.add(new Tuple3<>(0, 3, "b"));
	        list.add(new Tuple3<>(0, 2, "c"));
	        list.add(new Tuple3<>(0, 4, "d"));
	        list.add(new Tuple3<>(1, 5, "a"));
	        list.add(new Tuple3<>(1, 2, "b"));
	        list.add(new Tuple3<>(1, 7, "c"));
	
	        DataStreamSource<Tuple3<Integer, Integer, String>> stringDataStreamSource = env.fromCollection(list);
	
	        KeyedStream<Tuple3<Integer, Integer, String>, Integer> result = stringDataStreamSource
	                .keyBy(new KeySelector<Tuple3<Integer, Integer, String>, Integer>() {
	                           @Override
	                           public Integer getKey(Tuple3<Integer, Integer, String> value) throws Exception {
	                               return value.f0;
	                           }
	                       }
	                );
	
	        result.max(1).print("最大值");
	        result.maxBy(1).print("元素");
	
	        env.execute("测试");
	    }
	}

原数据:

原数据:3> (0,1,a)
原数据:3> (0,3,b)
原数据:3> (0,2,c)
原数据:3> (0,4,d)
原数据:3> (1,5,a)
原数据:3> (1,2,b)
原数据:3> (1,7,c)


返回结果:
最大值:3> (0,1,a)
最大值:3> (0,3,a)
最大值:3> (0,3,a)
最大值:3> (0,4,a)
最大值:3> (1,5,a)
最大值:3> (1,5,a)
最大值:3> (1,7,a)

元素:3> (0,1,a)
元素:3> (0,3,b)
元素:3> (0,3,b)
元素:3> (0,4,d)
元素:3> (1,5,a)
元素:3> (1,5,a)
元素:3> (1,7,c)


总结:

差在精度上

  • max: 不会关心指定的聚合字段和用来比较的字段外其他字段的正确性,3个字段,以第一个为key,对第2个比较。这个函数认为用户只想知道key字段和该key上的最大数值,所以第3个字段没必要更新了。比如 (0, 1, “a”),(0, 3, “b”), (0, 2, “c”)。既然是以第一个字段为key,求第2个字段的最大值,那么只会记录,(0,1,“a”),(0,3,a),(0,3,a),(0,4,a),节省了空间。
  • maxBy: 认为使用者关心的不仅仅是对应的key和该key的最大数值,还有其他字段,返回的整条数据都是精确的,相对上条,会返回对应最大值所在的整个元素。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

隐形21

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

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

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

打赏作者

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

抵扣说明:

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

余额充值