Google cloud dataflow Apache Beam中的早期触发和链式聚合
在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
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