Apache flink 无法使用WindowsStream.apply()函数应用WindowFunction

Apache flink 无法使用WindowsStream.apply()函数应用WindowFunction,apache-flink,flink-streaming,Apache Flink,Flink Streaming,我对使用ApacheFlink和Scala还比较陌生,我刚刚掌握了一些基本功能。我在尝试实现自定义的WindowFunction时遇到了麻烦 问题是,当我尝试实现自定义的WindowFunction时,IDE在“.apply()”函数上给出了一个错误 Cannot resolve symbol apply Unspecified value parameters: foldFunction: (NotInferedR, Data.Fingerprint) => NotInferedR,

我对使用ApacheFlink和Scala还比较陌生,我刚刚掌握了一些基本功能。我在尝试实现自定义的
WindowFunction
时遇到了麻烦

问题是,当我尝试实现自定义的
WindowFunction
时,IDE在“.apply()”函数上给出了一个错误

Cannot resolve symbol apply

Unspecified value parameters: foldFunction: (NotInferedR, Data.Fingerprint) => NotInferedR, windowFunction: (Tuple, TimeWindow, Iterable[NotInferedR], Collector[NotInferedR]) => Unit 
Unspecified value parameters: foldFunction: FoldFunction[Data.Fingerprint, NotInferedR], function: WindowFunction[NotInferedR, NotInferedR, Tuple, TimeWindow] 
Unspecified value parameters: function: WindowFunction[Data.Fingerprint, NotInferedR, Tuple, TimeWindow] 
Unspecified value parameters: windowFunction: (Tuple, TimeWindow, Iterable[Data.Fingerprint], Collector[NotInferedR]) => Unit 

Type mismatch, expected: (Tuple, TimeWindow, Iterable[Data.Fingerprint], Collector[NotInferedR]) => Unit, actual: DataTimeWindow.DataWindow 
Type mismatch, expected: WindowFunction[Data.Fingerprint, NotInferedR, Tuple, TimeWindow], actual: DataTimeWindow.DataWindow
这是我的代码:

val test = hashMap
      .keyBy("hash")
      .timeWindow(Time.minutes(1))
      .apply(new DataWindow())
这是
窗口函数

class DataWindow extends WindowFunction[Data.Fingerprint, String, String, TimeWindow]  {

    override def apply(key: String,
                       window: TimeWindow,
                       input: Iterable[Fingerprint],
                       out: Collector[String]) {

      out.collect("helo")
    }
  }

我认为问题在于
WindowFunction
的第三个类型参数,即键的类型。由于您将
keyBy
方法中的键声明为字符串(
keyBy(“hash”)
),因此无法在编译时确定键的类型。有两个选项可以解决此问题:

  • 使用
    keyBy
    中的
    KeySelector
    函数提取密钥(类似于
    keyBy(x:FingerPrint=>x.hash)
    )。
    KeySelector
    函数的返回类型在编译时已知,因此您可以使用键入的
    WindowFunction
  • WindowFunction
    的第三个类型参数的类型更改为
    Tuple
    Tuple
    是由
    keyBy
    提取的密钥的通用持有者。在您的情况下,它将是一个
    Tuple1
    ,可以通过
    Tuple1.f0
    访问哈希字符串

  • 您好@fabian,我添加了
    keyBy((x:Data.Fingerprint)=>x.hash)
    ,在我的“数据窗口”类中,我将
    String
    更改为
    Tuple1[String]
    ,但我遇到了相同的问题。您是同时做了这两个更改还是一个接一个地尝试了这两个更改?如果更改
    密钥提取程序
    ,则应将密钥类型保留为
    字符串
    。我尝试了这两种解决方案。我解决了此问题,我需要导入
    org.apache.flink.streaming.api.scala.function.WindowFunction
    not
    org.apache.flink.streaming.api.functions.windowing.WindowFunction
    感谢@fabian在这个问题上花点时间。谢谢Flinkoob@FabianHueske是否有任何方法可以在错误中给出其他提示或更改导入?这真令人困惑