scala-找不到类型为的证据参数的隐式值org.apache.flink网站.api.common.typeinfo.TypeInformation[…]


0

我正试图为apacheflink编写一些用例。我经常遇到的一个错误是

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扩展了GeneratorSource[(Int,String)],GeneratorSource[T]扩展了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、 第一个scala项目和第一个flink项目,所以请耐心等待

3 答案


0

这通常发生在用户代码,即源代码、 map函数或其他具有泛型参数的性质的代码时。在大多数情况下,您可以通过添加类似

implicit val typeInfo = TypeInformation.of(classOf[(Int, String)])

如果您的代码在另一个具有泛型参数的方法内,您也可以尝试添加一个绑定到该方法的泛型参数的上下文,如中所示

def myMethod[T: TypeInformation](input: DataStream[Int]): DataStream[T] = ...

0

您可以进行导入而不是隐式

import org.apache.flink.streaming.api.scala._

这也会有帮助。


0
我的问题是,我真的无法确定它们何时发生,何时不发生。

它们发生在需要隐式参数时。如果我们看一下方法定义,我们会看到:

def addSource[T: TypeInformation](function: SourceFunction[T]): DataStream[T]

但是我们没有看到任何隐式参数被定义,它 where?

当您看到一个多态方法,其中类型参数的形式为

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类型的证据参数的隐式值”。

对于泛型方法,还需要它们在调用 site生成类型信息:

对于泛型方法,函数参数和返回类型的数据类型对于每次调用可能都不相同,并且在定义方法的 site上是未知的。上面的代码将导致没有足够的隐含证据的错误。

注意导入org.apache.flink网站.流式处理.api.scala也可能有必要。

对于您的类型,这意味着如果调用方法是泛型的,它还需要请求其类型参数的上下文绑定。


我来回答

写文章

提问题

面试题