答案 0 :(得分:2)
使用Apache Flink,可以通过iterate
API调用定义反馈边缘。 iterate
方法需要一个步进函数,在给定输入流的情况下,该函数产生反馈流和输出流。前一个流被反馈到阶梯函数,后一个流被发送到下游操作员。
一个简单的例子如下:
val env = StreamExecutionEnvironment.getExecutionEnvironment
val input = env.fromElements(1).map(x => (x, math.random))
val output = input.iterate {
inputStream =>
val iterationBody = inputStream.flatMap {
randomWalk =>
val (step, position) = randomWalk
val direction = 2 * (math.random - 0.5)
val bifurcate = math.random >= 0.75
Seq(
Some((step + 1, position + direction)),
if (bifurcate) Some((step + 1, position - direction)) else None).flatten
}
val feedback = iterationBody.filter {
randomWalk => math.abs(randomWalk._2) < 1.0
}
val output = iterationBody.filter {
randomWalk => math.abs(randomWalk._2) >= 1.0
}
(feedback, output)
}
output.print()
// execute program
env.execute("Random Walk with Bifurcation")
在这里,我们计算一个随机游走,我们随机分开我们的步行,以相反的方向前进。如果绝对位置值大于或等于1.0
,则完成随机游走。