找不到org.apache.flink.api.common.typeinfo.typeinfo.typeinforma



我正在尝试为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>

相关内容

  • 没有找到相关文章

最新更新