У меня есть набор записей с последовательными идентификаторами. Набор записей отсортирован по полю ID. Я хотел бы взять скользящее окно из 10 записей (т.е. записи 0-9, затем записи 1-10, записи 2-11 и т. Д.). В Python и Pandas отлично работает следующее:

windows = my_data_frame.rolling(10).sum().dropna()

Я хотел бы сделать то же самое в Apache Beam. Прочитав Руководство по программированию Apache Beam, выяснилось, что единственный способ использовать окна - это по отметке времени. Кроме того, этот пример подразумевает, что для выполнения окон по записи мне нужно добавить произвольную метку времени к каждой записи, а затем окно на этой метке времени.

Я очень новичок в Apache Beam, и поскольку оконное управление по записи - это, по сути, одна строка в Pandas, я чувствую, что мне не хватает чего-то в Beam, что позволило бы мне это сделать.

0
jason 1 Янв 2018 в 06:18

2 ответа

Лучший ответ

Вы можете ввести свои последовательные идентификаторы в качестве меток времени событий и использовать SlidingWindow.of(10).every(1). Единица времени зависит от того, как вы преобразовываете последовательные идентификаторы во временные метки событий.

Код будет выглядеть так

TextIO
   .read(...)
   .apply(ParDo.of(new DoFn<String, Long>() {
      @ProcessElement
      public void processElement(ProcessContext c) {
        c.outputWithTimestamp(..., timestamp transformed from sequential IDs)
      }
   }))
   .apply(SlidingWindow.of(10).every(1))
   .apply(Sums.longsGlobally())
0
Jiayuan Ma 26 Янв 2018 в 20:02

Поскольку у вас уже есть набор записей, вы можете написать пакетный конвейер. Для каждой записи вы можете сопоставить ее с парой ключ / значение, где ключ, скажем, id / 10, а значение - это запись. Затем вы можете выполнить GroupByKey, которая сгруппирует (или, по-вашему, окно) 10 записей в один ключ.

В вашем примере, если вы хотите суммировать каждые 10 элементов, вы также можете использовать преобразование Sum (после присоединения каждой записи с ключом), например из https://beam.apache.org/documentation/sdks/javadoc/0.5.0/org /apache/beam/sdk/transforms/Sum.html:

PCollection<KV<String, Integer>> input = ...;
PCollection<KV<String, Integer>> sumPerKey = input
    .apply(Sum.<String>integersPerKey());
0
Andy Xu 4 Янв 2018 в 19:50