1.我在测试ProcessFunction时遇到了一个错误:
type Context is not a member of object org.apache.flink.streaming.api.functions.ProcessFunction
package ProcessFunctionTest
import test.{ClickSource, Event}
import org.apache.flink.streaming.api.functions.ProcessFunction
import org.apache.flink.streaming.api.scala._
import org.apache.flink.util.Collector
object ProcessFunctionTest {
def main(args: Array[String]): Unit = {
val env = StreamExecutionEnvironment.getExecutionEnvironment
env.setParallelism(1)
val stream = env.addSource(new ClickSource).assignAscendingTimestamps(_.timestamp)
stream.process(new ProcessFunction[Event,String] {
override def processElement(i: Event, context: ProcessFunction[Event, String]#Context, collector: Collector[String]): Unit = {
if (i.user == "Mary")
collector.collect(i.user)
else if (i.user == "Bob"){
collector.collect(i.user)
collector.collect(i.user)
}
}
override def onTimer(l: Long, onTimerContext: ProcessFunction.OnTimerContext, collector: Collector[String]): Unit = ???
}).print()
env.execute()
}
}
在匿名类ProcessFunction里只需要实现processElement一个抽象方法,并不需要实现onTimer,
但是我这里使用的ProcessFunction中,必须实现processElement和onTimer两种方法。我发现我使用的是ProcessFunction接口,并不是抽象类。我发现在flink-streaming-java_2.11中ProcessFunction是接口,而在flink-streaming-java_2.12中,ProcessFunction是抽象类。
2.解决方法:
flink-streaming-java版本冲突,将org.apache.flink中的flink-streaming-java_2.11删除,问题成果解决。