我有一组有顺序ID的记录。记录集按ID字段排序。我想取一个滚动窗口,有10个记录(即记录0-9,然后记录1-10,记录2-11,等等)。在Python和Pandas中,以下内容工作得很好:
windows = my_data_frame.rolling(10).sum().dropna()
我想在Apache中完成同样的任务。读取Apache光束编程指南似乎是通过时间戳进行窗口化的唯一方法。此外,这个例子意味着,为了通过记录完成窗口,我需要在每个记录中添加一个任意时间戳,然后在该时间戳上添加一个窗口。
我对Apache非常陌生,因为按记录加窗口基本上是Pandas中的一行,我觉得我在Beam中遗漏了一些东西,这将使我能够完成这个任务。
发布于 2018-01-26 20:02:35
您可以将顺序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())
发布于 2018-01-04 19:50:54
由于您已经拥有了一组记录,所以可以编写批处理管道。对于每个记录,您可以将其映射到一个键/值对,其中键是id/10,值是记录。然后,您可以执行一个GroupByKey,哪个组(或在您的单词中,窗口) 10条记录在一个键中。
在您的示例中,如果您希望每10个元素加和一次,也可以使用求和转换(在您用键附加每个记录之后),例如来自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());
https://stackoverflow.com/questions/48046950
复制相似问题