我正在固定数据窗口上计算统计信息(最小值,平均值等)。数据以单点形式流进并且是连续的(如温度)。
我当前的管道(此问题已简化)如下:
read -> window -> compute stats (CombineFn) -> write
问题在于每个窗口的统计信息不正确,因为它们没有基准。意思是说,我希望每个窗口的统计信息都包含前一个窗口数据中的一个数据点(最新的一个)。
对此进行考虑的一种方法是,每个窗口的输入PCollection应该包括由于其时间戳而通常在窗口中的输入,而且还要比前一个窗口的PCollection多一个点。
我不确定该怎么做。这是我想到的一些事情:
一个约束是,如果一个窗口没有任何新数据点(除了转发给它的那个),它应该将该值重新转发到下一个窗口。
答案 0 :(得分:1)
听起来您可能需要将一个窗口中的值复制到任意多个将来的窗口中。我知道如何执行此操作的唯一方法是通过state and timers。
您可以编写一个有状态的DoFn,该DoFn对全局窗口数据进行操作,并在每个窗口的状态中存储最新(按时间戳记)元素,并在每个窗口边界处触发一个计时器,将该元素进入后续窗口。 (您可能需要利用Latest合并操作来获取每个窗口的最新元素,而不是手动进行操作。)使用原始数据将其展平,然后通过窗口操作即可获得所需的值。