【问题标题】:could not find implicit value for evidence parameter of type org.apache.flink.api.common.typeinfo.TypeInformation[...]找不到 org.apache.flink.api.common.typeinfo.TypeInformation[...] 类型的证据参数的隐式值
【发布时间】:2016-06-20 10:21:16
【问题描述】:

我正在尝试为 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 项目,请耐心等待

【问题讨论】:

    标签: scala apache-flink flink-streaming


    【解决方案1】:

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

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

    这也会有所帮助。

    【讨论】:

    • 这个答案更好,因为如果flink过程很复杂,它可以避免创建TypeInformation隐式很多时间:)
    • 为什么有效?从包中导入所有东西似乎是一种反模式
    • 为什么它对我不起作用?我有 import org.apache.flink.streaming.api.scala._ 并且仍然收到此错误。我正在使用 flink 1.12.2。
    • 奇怪,包对象在 1.11.3 中看起来完全一样,而 1.12.3 不起作用。
    【解决方案2】:

    这主要发生在您拥有用户代码时,即源代码或映射函数或具有通用参数的类似性质的东西。在大多数情况下,您可以通过添加类似的东西来解决这个问题

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

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

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

    【讨论】:

    • 这个解决方案似乎有效。方法调用是TypeInformation.of(classOf[(Int, String)]),你可能想在你的答案中解决这个问题。
    【解决方案3】:

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

    它们发生在需要 implicit parameter 时。如果我们看一下我们看到的方法定义:

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

    但是我们没有看到任何隐式定义的参数,它在哪里?

    当你看到一个类型参数的形式是多态方法时

    def foo[T : M](param: T)
    

    其中T 是类型参数,Mcontext bound。这意味着该方法的创建者正在请求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,在 Type Information 下,我们可以看到为什么会发生这种情况:

    证据参数错误无隐含值

    在无法创建 TypeInformation 的情况下,程序无法编译并显示错误提示 “找不到 TypeInformation 类型的证据参数的隐含值”。 一个常见的原因是生成TypeInformation 的代码尚未导入。 确保导入整个 flink.api.scala 包。 导入 org.apache.flink.api.scala._

    对于通用方法,您还需要要求它们在调用站点生成TypeInformation

    对于泛型方法,每次调用的函数参数和返回类型的数据类型可能不同,并且在定义方法的站点上是未知的。上面的代码将导致没有足够的隐含证据可用的错误。 在这种情况下,类型信息必须在调用站点生成并传递给方法。 Scala 为此提供了隐式参数。

    请注意,import org.apache.flink.streaming.api.scala._ 也可能是必需的。

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

    【讨论】:

    • org.apache.flink.api.scala._ 已经被导入并且它仍然会发生。这就是我所说的“无法确定”的意思。
    • @jheyd 要求 GeneratorSource[T]SourceFunction[T] 也有上下文边界:GeneratorSource[T : TypeInformation], SourceFunction[T : TypeInformation]
    • SourceFunction 是 addSource 方法所需的 java 接口,将上下文边界添加到 GeneratorSource 并没有改变任何内容。
    • @jheyd 那么也许它需要在更近的范围内可用。调用tge flink API的方法也是泛型的吗?
    • import org.apache.flink.api.scala._ 对我有用,非常感谢
    【解决方案4】:

    例如 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>
    

    【讨论】:

      猜你喜欢
      • 2015-12-18
      • 1970-01-01
      • 1970-01-01
      • 2018-07-25
      • 2013-01-25
      • 2017-04-26
      • 2021-05-01
      • 1970-01-01
      • 2020-09-14
      相关资源
      最近更新 更多