如何在Apache Beam中创建10个记录的滚动窗口

时间:2018-01-01 03:18:07

标签: google-cloud-dataflow apache-beam

我有一组具有顺序ID的记录。记录集按ID字段排序。我想采取10个记录的滚动窗口(即记录0-9,然后记录1-10,记录2-11等...)。在Python和Pandas中,以下工作非常完美:

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

我想在Apache Beam中完成同样的事情。阅读Apache Beam Programming Guide看来,进行窗口化的唯一方法是通过时间戳。此外,this example意味着为了按记录完成窗口化,我需要为每个记录添加一个任意时间戳,然后在该时间戳上添加窗口。

我对Apache Beam非常陌生,并且由于记录窗口基本上是Pandas中的一行,我觉得我在Beam中缺少一些可以让我实现这一目标的东西。

2 个答案:

答案 0 :(得分:0)

由于您已拥有该组记录,因此可以编写批处理管道。对于每个记录,您可以将其映射到键/值对,其中键是,例如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());

答案 1 :(得分:0)

您可以将顺序ID作为事件时间戳注入,并使用SlidingWindow.of(10).every(1)。时间单位取决于您将顺序ID转换为事件时间戳的方式。

代码看起来像

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())