Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala ApacheFlink:创建滞后数据流_Scala_Apache Flink_Flink Streaming - Fatal编程技术网

Scala ApacheFlink:创建滞后数据流

Scala ApacheFlink:创建滞后数据流,scala,apache-flink,flink-streaming,Scala,Apache Flink,Flink Streaming,我刚开始使用Scala的ApacheFlink。有人能告诉我如何从当前的数据流中创建滞后流(滞后于k个事件或k个时间单位) 基本上,我想在数据流上实现一个自动回归模型(流上的线性回归,其本身具有时滞版本)。因此,需要一个类似于以下伪代码的方法 val ds : DataStream = ... val laggedDS : DataStream = ds.map(lag _) def lag(ds : DataStream, k : Time) : DataStream = { } 如果

我刚开始使用Scala的ApacheFlink。有人能告诉我如何从当前的数据流中创建滞后流(滞后于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…

如果我正确地满足了您的要求,我会将其实现为一个带有FIFO队列的
FlatMapFunction
。队列缓冲
k
事件,并在新事件到达时发出头部。如果需要容错流应用程序,则必须将队列注册为状态。Flink将负责检查状态(即队列),并在出现故障时恢复状态

flatmap函数可以如下所示:

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

}

返回具有时滞的元素更复杂。这将需要为发射使用计时器线程,因为该函数仅在新元素到达时调用。

您能否扩展您的问题并解释滞后流的含义?Thanks@FabianHueske,我认为对于滞后的数据流,他的意思是在数据团队中获取元素比通常要晚。例如,1分钟的延迟将比元素到达流时晚1分钟发出元素。问题是“延迟k个事件”,而不是“延迟x分钟”。一种解释是在由k个事件组成的FIFO队列中追加新事件,并在新事件到达时转发队列头元素。如果没有所需语义的明确定义,这个问题就无法得到回答。@FabianHueske如果流的频率不一致,我希望通过计数而不是时间来延迟它。还编辑了问题。希望有帮助。:)虽然我也很想知道时间变量。:)非常感谢你!这太棒了。:)