Может ли в любом случае преобразование набора данных-: Distinct() использоваться в потоке данных во Flink?

Мне было интересно, можно ли в любом случае использовать API потока данных Flink для удаления дубликатов из поступающих записей (может быть в течение определенного временного окна), как в API набора данных, который обеспечивает преобразование под названием «Отличное». Или в любом случае, если набор данных может быть преобразован в поток данных, учитывая, что набор данных преобразуется в поток данных для внутренней обработки во Flink.

Пожалуйста, помогите мне в этом. Заранее спасибо! Ваше здоровье!


person Anish Sarangi    schedule 05.03.2020    source источник


Ответы (1)


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

DataStream<...> stream = ...
stream.windowAll(TumblingEventTimeWindows.of(Time.seconds(5)))
    .process(new DistinctFunction<>());

public class DistinctFunction<T, W extends Window> extends ProcessAllWindowFunction<T, T, W> implements Function {
    public void process(final Context context, Iterable<T> input, Collector<R> out) throws Exception {
        Set<T> elements = new HashSet<>();
        input.forEach(elements::add);
        elements.forEach(out::collect);
    }
}

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

person Arvid Heise    schedule 05.03.2020
comment
Арвид, спасибо за совет, постараюсь интегрировать в приложение и проверить... - person Anish Sarangi; 06.03.2020