Apache flink 什么';s KeyedStream中max和maxBy之间的差异 KeyedStream#max(字符串字段)

Apache flink 什么';s KeyedStream中max和maxBy之间的差异 KeyedStream#max(字符串字段),apache-flink,Apache Flink,应用提供数据当前最大值的聚合 通过给定的键在给定的字段表达式处执行流。独立的 每个键保留聚合。字段表达式可以是 公共字段或带有{@link括号的getter方法 DataStream}的基础类型。一个点可以用来深入到 对象,如{@code“field1.fieldxy”} KeyedStream#maxBy(字符串字段) 应用为当前元素提供最大值的聚合 给定键在给定位置处的值。独立的集合体 每把钥匙都有。如果更多元素在给定位置具有最大值 默认情况下,运算符返回第一个位置 这两个API的javad

应用提供数据当前最大值的聚合 通过给定的键在给定的字段表达式处执行流。独立的 每个键保留聚合。字段表达式可以是 公共字段或带有{@link括号的getter方法 DataStream}的基础类型。一个点可以用来深入到 对象,如{@code“field1.fieldxy”}

  • KeyedStream#maxBy(字符串字段)
  • 应用为当前元素提供最大值的聚合 给定键在给定位置处的值。独立的集合体 每把钥匙都有。如果更多元素在给定位置具有最大值 默认情况下,运算符返回第一个位置


    这两个API的javadoc看起来非常相似,我会问它们之间有什么区别,什么时候选择这一个或那一个,在详细介绍实现之前,我无法告诉您这些区别

    让我们假设POJO记录的模式是(a:String,b:String,c:String)

    最大值(字符串字段)

    maxBy(“a”)对于每个键,返回其字段“a”替换为每个键的最大值“a”的第一条记录

    maxBy(字符串字段)

    max(“a”)返回最大字段为“a”的记录(如果有多条记录,则获取第一条记录)

    有关详细信息,您可以检查。max和maxBy之间的关系是max返回最大值,而maxBy返回此字段中具有最大值的元素

     keyedStream.max(0);
     keyedStream.max("key");
     keyedStream.maxBy(0);
     keyedStream.maxBy("key");
    
    在以下示例中,我们还可以看到不同之处:

    使用:


    谢谢@TiMr的帮助回答谢谢@bupt_ljy的帮助回答
      // Create a Tumbling Window with the values of 1 day:
                .timeWindow(Time.of(1, TimeUnit.DAYS))
                // Use the max Temperature of the day:
                .max("temperature")
                // And perform an Identity map, because we want to write all values of this day to the Database:
                .map(new MapFunction<elastic.model.LocalWeatherData, elastic.model.LocalWeatherData>() {
                    @Override
                    public elastic.model.LocalWeatherData map(elastic.model.LocalWeatherData localWeatherData) throws Exception {
                        return localWeatherData;
                    }
                });
    
      // Now take the Maximum Temperature per day from the KeyedStream:
        DataStream<LocalWeatherData> maxTemperaturePerDay =
                localWeatherDataByStation
                        // Use non-overlapping tumbling window with 1 day length:
                        .timeWindow(Time.days(1))
                        // And use the maximum temperature:
                        .maxBy("temperature");