В чем разница между max и maxBy в KeyedStream - PullRequest
0 голосов
/ 16 января 2019
  1. KeyedStream # max (строковое поле)

Применяет агрегацию, которая дает текущий максимум данных поток по заданному полю выражения по заданному ключу. Независимый Агрегат хранится на ключ. Выражение поля является либо именем открытое поле или метод получения с круглыми скобками {@link DataStream} базовый тип. Точка может быть использована для детализации объекты, как в {@code "field1.fieldxy"}.

  1. KeyedStream # maxBy (строковое поле)

Применяет агрегацию, которая дает текущему элементу максимум значение в заданной позиции по заданному ключу. Независимый агрегат хранится на ключ. Если больше элементов имеют максимальное значение при заданном положение, оператор возвращает первый по умолчанию.

Javadoc для этих двух API выглядит очень похоже, я хотел бы спросить, в чем разница между ними и когда выбирать тот или иной

Ответы [ 2 ]

0 голосов
/ 16 января 2019

Разница между max и maxBy заключается в том, что max возвращает максимальное значение, тогда как maxBy возвращает элемент, имеющий максимальное значение в этом поле.

 keyedStream.max(0);
 keyedStream.max("key");
 keyedStream.maxBy(0);
 keyedStream.maxBy("key");

В следующих примерах мы также можем увидеть разницу:

Использование max:

  // 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;
                }
            });

Использование maxBy:

  // 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");
0 голосов
/ 16 января 2019

Я также не могу рассказать вам о различиях, пока не рассмотрю подробные реализации.

Давайте предположим, что схема вашей записи POJO имеет вид (a: String, b: String, c: String).

max (строковое поле)

keyedStream.maxBy ("a") для каждой клавиши возвращает первую запись, поле которой "a" заменяется на max«a» каждой клавиши.

maxBy (строковое поле)

keyedStream.max («a») возвращает запись (получить первую, если их несколькозаписи) с полем max "a".

Для получения дополнительной информации вы можете проверить ComparableAggregator.java .

...