我刚刚开始使用Scala的Apache Flink。有人可以告诉我如何从我当前的数据流创建滞后流(滞后k事件或k单位时间)?
基本上,我想在数据流上实现自动回归模型(在流上使用时间滞后版本的线性回归)。因此,需要一种类似于以下伪代码的方法。
val ds : DataStream = ...
val laggedDS : DataStream = ds.map(lag _)
def lag(ds : DataStream, k : Time) : DataStream = {
}
如果每个事件的间隔为1秒,并且有2秒的延迟,我希望样本输入和输出是这样的。
输入:1,2,3,4,5,6,7 ...
输出:NA,NA,1,2,3,4,5 ...
答案 0 :(得分:5)
鉴于我的要求是正确的,我会将其实现为具有FIFO队列的FlatMapFunction
。队列缓冲k
个事件,并在新事件到达时发出头部。如果您需要容错流应用程序,则必须将队列注册为状态。然后,Flink将负责检查状态(即队列),并在发生故障时将其恢复。
FlatMapFunction
可能如下所示:
class Lagger(val k: Int)
extends FlatMapFunction[X, X]
with Checkpointed[mutable.Queue[X]]
{
var fifo: mutable.Queue[X] = new mutable.Queue[X]()
override def flatMap(value: X, out: Collector[X]): Unit = {
// add new element to queue
fifo.enqueue(value)
if (fifo.size == k + 1) {
// remove head element and emit
out.collect(fifo.dequeue())
}
}
// restore state
override def restoreState(state: mutable.Queue[X]) = { fifo = state }
// get state to checkpoint
override def snapshotState(cId: Long, cTS: Long): mutable.Queue[X] = fifo
}
更多涉及具有时滞的返回元素。这将需要用于发射的计时器线程,因为该函数仅在新元素到达时被调用。