我正在尝试为Apache Flink编写一些用例。我经常遇到的一个错误是
could not find implicit value for evidence parameter of type org.apache.flink.api.common.typeinfo.TypeInformation[SomeType]
我的问题是,当它们发生时,我无法真正钉住它们。
最新的例子将是以下
...
val largeJoinDataGen = new LargeJoinDataGen(dataSetSize, dataGen, hitRatio)
val see = StreamExecutionEnvironment.getExecutionEnvironment
val newStreamInput = see.addSource(largeJoinDataGen)
...
其中 LargeJoinDataGen extends GeneratorSource[(Int, String)]
和 GeneratorSource[T] extends SourceFunction[T]
均在单独的文件中定义。
试图构建它时,我会得到
Error:(22, 39) could not find implicit value for evidence parameter of type org.apache.flink.api.common.typeinfo.TypeInformation[(Int, String)]
val newStreamInput = see.addSource(largeJoinDataGen)
1。为什么给定示例中有错误?
2。当这些错误发生以及如何避免将来避免这些错误时,将是什么?
P.S。:第一个Scala项目和第一个Flink项目,请耐心等待
您可以进行导入而不是隐含
import org.apache.flink.streaming.api.scala._
它也将有所帮助。
这主要发生在您具有用户代码的情况下,即源或地图函数或具有通用参数的本质。在大多数情况下,您可以通过添加
之类的东西来解决此问题implicit val typeInfo = TypeInformation.of(classOf[(Int, String)])
如果您的代码在另一个具有通用参数的方法内部,您也可以尝试将上下文绑定到该方法的通用参数,如
中def myMethod[T: TypeInformation](input: DataStream[Int]): DataStream[T] = ...
我的问题是,当它们发生时,我无法真正钉住它们。
当需要隐式参数时,它们会发生。如果我们查看方法定义,我们会看到:
def addSource[T: TypeInformation](function: SourceFunction[T]): DataStream[T]
,但我们看不到任何隐式参数定义,它在哪里?
当您看到一种类型参数为form
的多态方法时def foo[T : M](param: T)
其中 T
是类型参数,而 M
是上下文结合。这意味着该方法的创建者正在请求类型M[T]
的隐式参数。它等效于:
def foo[T](param: T)(implicit ev: M[T])
在您的方法的情况下,实际上将其扩展到:
def addSource[T](function: SourceFunction[T])(implicit evidence: TypeInformation[T]): DataStream[T]
这就是为什么您会看到编译器抱怨的原因,因为它找不到该方法所需的隐式参数。
如果我们转到Apache Flink Wiki,在类型信息下,我们可以看到为什么会发生这种情况:
证据参数错误
没有隐式值
在无法创建
TypeInformation
的情况下,程序无法使用错误表示"找不到类型类型的证据参数的隐式值"。如果尚未导入生成TypeInformation
的代码,则常常是原因。确保导入整个Flink.api.scala软件包。导入org.apache.flink.api.scala ._
对于通用方法,您需要要求它们在呼叫站点也生成TypeInformation
:
对于通用方法,函数参数和返回类型的数据类型对于每个呼叫可能并不相同,并且在定义该方法的站点上不知道。上面的代码将导致错误,即没有足够的隐式证据可用。在这种情况下,必须在调用站点上生成类型信息并将其传递给该方法。Scala为此提供隐式参数。
请注意,import org.apache.flink.streaming.api.scala._
也可能是必要的。
对于您的类型,这意味着,如果调用方法是通用的,它还需要请求上下文对其类型参数的绑定。
例如scala版本(2.11,2.12等)不兼容二进制。
即使使用import org.apache.flink.api.scala._
:
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<scala.version>2.12.8</scala.version>
<scala.binary.version>2.11</scala.binary.version>
</properties>
Maven中的正确配置:
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<scala.version>2.12.8</scala.version>
<scala.binary.version>2.12</scala.binary.version>
</properties>