使用unbouded数据源的fixedWindow作为parDo的侧输入?

时间:2017-05-02 14:19:12

标签: google-cloud-dataflow

我正在从无界的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);
    }
}

1 个答案:

答案 0 :(得分:0)

总体问题是,从Pubsub读取时,Dataflow不知道元素的时间戳,因为对于您的用例,它是数据的属性。

您希望确保从Pubsub阅读时,您可以使用时间戳标签discussed here来提取记录。

最后,GameStats example使用侧输入来查找垃圾邮件用户。在您的情况下,您只需将所有时间点放入侧面输入中,而不是计算每个窗口的 globalMeanScore