Apache Beam - 窗口之间的Delta

时间:2018-05-03 17:54:34

标签: google-cloud-dataflow apache-beam

道歉,在努力简洁明了我之前对我的问题的描述变成了我试图解决的一般情况的特例。

新说明

我正在尝试比较聚合函数的最后一个发射值(比如说Sum())和我在当前窗口中聚合的每个元素。

enter image description here

值得注意的是,理想(我认为)解决方案将包括

  • 在time = t时使用的T2(来自t-1)元素是在上一个窗口中创建的元素。

我一直在玩几个想法/实验,但我很难找到一种方法来实现这一点,优雅和“同情”梁的计算模型(我仍然试图完全Grock文章/博客/文档和书籍:)

侧输入看起来很笨重,因为看起来我必须将发出的5M @ T-1聚合的时间戳移到5M @T的窗口,以便将它与当前的5M窗口对齐

尝试使用侧输入(我理解它们)时,我最终得到了一些非常“循环引用”的讨厌代码,但不是以优雅的递归方式:)

非常感谢任何正确方向的帮助。

修改 修改后的图表和改进的描述更清楚地表明:

  • 使用发射的T2(来自t-1)来计算t
  • 处的T2的意图
  • 用于计算T2的期望T2(来自t-1)是具有正确密钥的T2

1 个答案:

答案 0 :(得分:1)

您应该提供一个窗口映射fn,它只是将当前窗口映射到过去的窗口,而不是修改已实现的记录的时间戳,以便它们出现在当前窗口中。 您需要创建一个自定义WindowFn,它实现您需要特别注意覆盖getDefaultWindowMappingFn函数的窗口映射行为。

你的管道就像:

PCollection<T> mySource = /* data */
PCollectionView<SumT> view = mySource
    .apply(Window.into(myCustomWindowFnWithNewWindowMappingFn))
    .apply(Combine.globally(myCombiner).asSingletonView());

mySource.apply(ParDo.of(/* DoFn that consumes side input */).withSideInputs(view));

特别注意组合器将产生的默认值,因为当视图没有数据发出时,这将是默认值。 此外,编写自定义窗口函数的最简单方法是复制现有函数。