У меня есть набор записей с последовательными идентификаторами. Набор записей отсортирован по полю 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, что позволило бы мне это сделать.
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())
Поскольку у вас уже есть набор записей, вы можете написать пакетный конвейер. Для каждой записи вы можете сопоставить ее с парой ключ / значение, где ключ, скажем, 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());
Похожие вопросы
Новые вопросы
google-cloud-dataflow
Облачный поток данных Google - это полностью управляемый облачный сервис для создания и оценки конвейеров обработки данных в масштабе. Конвейеры потоков данных основаны на модели программирования Apache Beam и могут работать как в пакетном, так и в потоковом режимах. Облачный поток данных является частью облачной платформы Google.