我有一组具有顺序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中缺少一些可以让我实现这一目标的东西。
答案 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())