Сортировка набора данных Flink на основе нескольких селекторов ключей

Я хочу отсортировать POJO DataSet на основе нескольких значений с помощью нескольких функций KeySelector:

    DataSet<PoJo> data = input
            .sortPartition(new KeySelector<PoJo, Integer>() { 
                 public Integer getKey(PoJo element) { return someKeyFromPojo(element); }}, Order.Descending)
            .sortPartition(new KeySelector<PoJo, Integer>() { 
                 public Integer getKey(PoJo element) { return anotherKeyFromPojo(element); }}, Order.Ascending);

Это приводит к ошибке KeySelector, которая не может быть связана. Согласно документации Flink, должно быть возможно объединить функции sortPartition в цепочку.

Есть ли способ решить эту проблему без использования выражений поля?


person tooobsias    schedule 06.12.2020    source источник


Ответы (1)


Вы можете объединять sortPartition вызовы в цепочку тогда и только тогда, когда вы используете sortPartition(int field, Order order) или sortPartition(String field, Order order). sortPartition(KeySelector<T, K> keyExtractor, Order order) не позволяет создавать цепочки.

Если вам нужно вычислить ключ, ваш KeySelector может вернуть все, что вам нравится, при условии, что он хешируемый и сопоставимый. Например, кортеж, такой как (someKey, anotherKey).

person David Anderson    schedule 06.12.2020
comment
Но разве это не ограничивает мои возможности сортировки в разном порядке? - person tooobsias; 06.12.2020
comment
Предполагая, что вы возвращаете некоторый класс MyKey из вашего PoJo, который имеет два поля, тогда вы можете определить компаратор для MyKey, чтобы он сортировал по убыванию (т.е. в обратном порядке) для первого поля, и если это первое поле равно, то сортировать по возрастанию для второе поле. - person kkrugler; 08.12.2020