【问题标题】:Getting values from previous windows从以前的窗口中获取值
【发布时间】:2019-06-11 15:33:11
【问题描述】:

我正在计算固定数据窗口的统计数据(最小值、平均值等)。数据作为单点流入并且是连续的(如温度)。

我当前的管道(针对这个问题进行了简化)如下所示:

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

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

考虑这一点的一种方法是,每个窗口的输入 PCollection 应包括由于其时间戳而通常在窗口中的输入,但还应包括前一个窗口的 PCollection 的一个额外点。

我不确定我应该如何去做。以下是我想做的一些事情:

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

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

【问题讨论】:

  • 请发布一些代码来显示您尝试过的内容。
  • 可以找到与您在第一点中描述的类似的实现here
  • @GuillemXercavins 我已经为管道的不同部分这样做了。这里的区别是我只想要一个(最新的)值被复制。考虑到延迟发射,这有点令人费解。

标签: java python apache-beam


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2017-12-17
    • 2019-09-22
    • 1970-01-01
    • 2019-06-10
    • 1970-01-01
    • 1970-01-01
    • 2015-12-26
    • 2016-12-16
    • 1970-01-01
    相关资源
    最近更新 更多