我正在从无界的pub / sub数据源读取数据(GPS坐标,带有时间戳),需要计算所有这些点之间的距离。我的想法是让我们说1分钟的窗口,并将整个集合作为侧输入进行ParDo,我使用侧输入查找下一个点并计算ParDo内的距离。
如果我运行管道,我可以看到View.asList步骤没有产生任何输出。此外,calcDistance永远不会产生任何输出。有没有关于如何使用FixedWindow集合作为侧输入的示例? picture of pipeline
管道:
PCollection<Timepoint> inputWindow = pipeline.apply(PubsubIO.Read.topic(""))
.apply(ParDo.of(new ExtractTimestamps()))
.apply(Window.<Timepoint>into(FixedWindows.of(Duration.standardMinutes(1))));
final PCollectionView<List<Timepoint>> SideInputWindowed = inputWindow.apply(View.<Timepoint>asList());
inputWindow.apply(ParDo.named("Add Timestamp "+teams[i]).of(new AddTimeStampAsKey()))
.apply(ParDo.of(new CalcDistanceTest(SideInputWindowed)).withSideInputs(SideInputWindowed));
帕尔:
static class CalcDistance extends DoFn<KV<String,Timepoint>,Timepoint> {
private final PCollectionView<List<Timepoint>> pCollectionView;
public CalcDistance(PCollectionView pCollectionView){
this.pCollectionView = pCollectionView;
}
@Override
public void processElement(ProcessContext c) throws Exception {
LOG.info("starting to calculate distance");
Timepoint input = c.element().getValue();
//doing distance calculation
c.output(input);
}
}
答案 0 :(得分:0)
总体问题是,从Pubsub读取时,Dataflow不知道元素的时间戳,因为对于您的用例,它是数据的属性。
您希望确保从Pubsub阅读时,您可以使用时间戳标签discussed here来提取记录。
最后,GameStats example使用侧输入来查找垃圾邮件用户。在您的情况下,您只需将所有时间点放入侧面输入中,而不是计算每个窗口的 globalMeanScore 。