【问题标题】:Apache Flink: ProcessWindowFunction implementationApache Flink:ProcessWindowFunction 实现
【发布时间】:2018-11-29 22:05:20
【问题描述】:

我正在尝试使用 Scala 在我的 Apache Flink 项目中使用 ProcessWindowFunction。不幸的是,我已经无法实现一个基本的 ProcessWindowFunction,就像 Apache Flink 文档中使用的那样。

这是我的代码:

import org.apache.flink.streaming.api.scala._
import org.apache.flink.streaming.api.scala.{StreamExecutionEnvironment, _}
import org.apache.flink.streaming.api.windowing.time.Time
import org.fiware.cosmos.orion.flink.connector.{NgsiEvent, OrionSource}
import org.apache.flink.streaming.api.functions.windowing.ProcessWindowFunction
import org.apache.flink.streaming.api.windowing.windows.TimeWindow
import org.apache.flink.streaming.api.windowing.assigners.SlidingProcessingTimeWindows
import org.apache.flink.util.Collector
import scala.collection.TraversableOnce

object StreamingJob {
 def main(args: Array[String]) {

 val env = StreamExecutionEnvironment.getExecutionEnvironment
 val eventStream = env.addSource(new OrionSource(9001))

 val processedDataStream = eventStream.flatMap(event => event.entities)
   .map(entity => (entity.id, entity.attrs("temperature").value.asInstanceOf[String]))
     .keyBy(_._1)
     .window(SlidingProcessingTimeWindows.of(Time.seconds(10), Time.seconds(5)))
     .process(new MyProcessWindowFunction())

 env.execute("Socket Window NgsiEvent")
 }
}


private class MyProcessWindowFunction extends ProcessWindowFunction[(String, String), String, String, TimeWindow] {

def process(key: String, context: Context, input: Iterable[(String, String)], out: Collector[String]): Unit = {
  var count: Int = 0
  for (in <- input) {
    count = count + 1
  }
  out.collect(s"Window ${context.window} count: $count")
 }
}

从 IntelliJ 我得到以下提示:

1) 这显示了新类对象的创建位置:

Type mismatch, expected: ProcessWindowFunction[(String, String), NotInferedR, String, TimeWindow], actual: MyProcessWindowFunction

2) 这直接显示在课堂上:

Class 'MyProcessWindowFunction' must either be declared abstract or implement abstract member 'process(key:KEY, context:ProcessWindowFunction.Context, iterable:Iterable<IN>, collector:Collector<OUT>):void' in 'org.apache.flink.streaming.api.functions.windowing.ProcessWindowFunction'

构建代码显示以下错误:

Error:(51, 16) type mismatch;
found   : org.apache.flink.MyProcessWindowFunction
required: 
org.apache.flink.streaming.api.scala.function.ProcessWindowFunction[(String, String),?,String,org.apache.flink.streaming.api.windowing.windows.TimeWindow]
  .process(new MyProcessWindowFunction())

感谢您的每一次帮助。

【问题讨论】:

    标签: scala apache-flink


    【解决方案1】:

    在与另外 2 个人一起调试了一段时间后,我们终于找到了问题所在。

    在我的代码中,我使用了以下导入:

    import org.apache.flink.streaming.api.functions.windowing.ProcessWindowFunction
    

    但使用 Scala 时正确的导入似乎是:

    import org.apache.flink.streaming.api.scala.function.ProcessWindowFunction
    

    【讨论】:

    • 谢谢!,经过数小时的思考,我得以解决这个问题,感谢这些信息。谢谢!
    【解决方案2】:
    //package of  ProcessWindowFunction is 
    import org.apache.flink.streaming.api.scala.function.ProcessWindowFunction
    
    //The correct way to call this method
    new MyProcessWindowFunction()[(String, String), String, String, TimeWindow]
    
    //I know the official documents don't.This may be a bug
    

    【讨论】:

    • 对于 Flink 1.12,调用 new MyProcessWindowFunction()[(String, String), String, String, TimeWindow] 的方法会导致 MyProcessWindowFunction 类型的构造函数 ProcessSurveyWindowFunction 不带类型参数。错误
    猜你喜欢
    • 1970-01-01
    • 2020-09-07
    • 2013-06-11
    • 2020-04-24
    • 1970-01-01
    • 1970-01-01
    • 2020-01-31
    • 2017-10-15
    • 1970-01-01
    相关资源
    最近更新 更多