Google cloud dataflow Apache Beam中的早期触发和链式聚合

Google cloud dataflow Apache Beam中的早期触发和链式聚合,google-cloud-dataflow,apache-beam,Google Cloud Dataflow,Apache Beam,在Apache Beam中,是否可以使用不同的窗口和触发组合/链接多个聚合 示例: 我有一个输入PCollection,我需要计算两个和:1分钟固定窗口和1小时滑动窗口每1分钟,我想每分钟得到推测结果 触发: 有一个输入:PCollection input我可以通过两个聚合来完成: PCollection<KV<String, Long>> oneMinSum = input .apply(Window.into(1 min).triggering(trigger

在Apache Beam中,是否可以使用不同的窗口和触发组合/链接多个聚合

示例:

我有一个输入
PCollection
,我需要计算两个和:1分钟固定窗口和1小时滑动窗口每1分钟,我想每分钟得到推测结果

触发:

有一个输入:
PCollection input
我可以通过两个聚合来完成:

PCollection<KV<String, Long>> oneMinSum = input
    .apply(Window.into(1 min).triggering(trigger))
    .apply(Sum.longsPerKey())
我所看到的所有示例都假设
Window.into
仅应用于
PCollection
一次,并且在计算聚合后,结果将进入某些存储(例如BigQuery等),我从未见过任何“链接”聚合和多次更改窗口的示例


Beam编程模型的用例正确吗?或Beam编程模型假定,
Window.into(…).triggering(…)
将只指定一次?

TLDR:要解决此问题,请在第一次聚合中使用
丢弃FiredPanes

您指定的触发器与您认为的不同。
AfterProcessingTime.pastFirstElementInPane().plusDelayOf(一分钟))
在窗格中的第一个元素后1分钟触发,但由于您还重复使用
累积FiredPanes()
。永久(…)
,触发器将触发

(i) 第一次安装第一个元件后1分钟

(ii)每次在(i)满足后出现新元素时

对于您的测试用例,我对
oneMinSum

.advanceWatermarkTo(t0)
.addElements(KV.of("a", 1))
.advanceProcessingTime(TWO_MINUTES) // emit (a, 1) because of (i)
.addElements(KV.of("a", 1))
.advanceProcessingTime(TWO_MINUTES) // emit (a, 2) because of (ii)
.advanceWatermarkTo(t1)             // emit another (a, 2) past watermark
.addElements(KV.of("a", 1))
.advanceProcessingTime(TWO_MINUTES) // emit (a, 1) because of (i)
.advanceWatermarkToInfinity();      // emit another (a, 1) past watermark
解释了
(a,2)
(a,1)
的双重发射

对于
onHourSums
,您可以

  • key=a值=1
    因为提前触发
  • key=a值=5(1+2+2)
    因为提前触发
  • key=a值=7(1+2+2+1+1)
    因为窗口关闭
PCollection<KV<String, Long>> slidingSum = input
    .apply(Window.into(1 hour sliding 1 min).triggering(trigger))
    .apply(Sum.longsPerKey())
key=a value=1
    window=[2017-01-01T00:00:00.000Z..2017-01-01T00:10:00.000Z)
    pane=PaneInfo{isFirst=true, timing=EARLY, index=0}
key=a value=5
    window=[2017-01-01T00:00:00.000Z..2017-01-01T00:10:00.000Z)
    pane=PaneInfo{timing=EARLY, index=1}
key=a value=7
    window=[2017-01-01T00:00:00.000Z..2017-01-01T00:10:00.000Z)
    pane=PaneInfo{isLast=true, timing=ON_TIME, index=2, onTimeIndex=0}
.advanceWatermarkTo(t0)
.addElements(KV.of("a", 1))
.advanceProcessingTime(TWO_MINUTES) // emit (a, 1) because of (i)
.addElements(KV.of("a", 1))
.advanceProcessingTime(TWO_MINUTES) // emit (a, 2) because of (ii)
.advanceWatermarkTo(t1)             // emit another (a, 2) past watermark
.addElements(KV.of("a", 1))
.advanceProcessingTime(TWO_MINUTES) // emit (a, 1) because of (i)
.advanceWatermarkToInfinity();      // emit another (a, 1) past watermark