从以前的窗口获取值

时间:2019-06-11 15:33:11

标签: java python apache-beam

我正在固定数据窗口上计算统计信息(最小值,平均值等)。数据以单点形式流进并且是连续的(如温度)。

我当前的管道(此问题已简化)如下:

read -> window -> compute stats (CombineFn) -> write

问题在于每个窗口的统计信息不正确,因为它们没有基准。意思是说,我希望每个窗口的统计信息都包含前一个窗口数据中的一个数据点(最新的一个)。

对此进行考虑的一种方法是,每个窗口的输入PCollection应该包括由于其时间戳而通常在窗口中的输入,而且还要比前一个窗口的PCollection多一个点。

我不确定该怎么做。这是我想到的一些事情:

  • 使用修改后的时间戳在每个窗口中复制最新的数据点,使其落在下一个窗口的时间范围内
  • 类似地,为每个窗口创建一个PCollectionView单例,其中包括其最新数据点的修改版本,它将作为侧面输入使用,并合并到下一个窗口的输入PCollection中。

一个约束是,如果一个窗口没有任何新数据点(除了转发给它的那个),它应该将该值重新转发到下一个窗口。

1 个答案:

答案 0 :(得分:1)

听起来您可能需要将一个窗口中的值复制到任意多个将来的窗口中。我知道如何执行此操作的唯一方法是通过state and timers

您可以编写一个有状态的DoFn,该DoFn对全局窗口数据进行操作,并在每个窗口的状态中存储最新(按时间戳记)元素,并在每个窗口边界处触发一个计时器,将该元素进入后续窗口。 (您可能需要利用Latest合并操作来获取每个窗口的最新元素,而不是手动进行操作。)使用原始数据将其展平,然后通过窗口操作即可获得所需的值。