关于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的最大数值,还有其他字段,返回的整条数据都是精确的,相对上条,会返回对应最大值所在的整个元素。