jhe*_*eyd 19 scala apache-flink flink-streaming
我正在尝试为Apache Flink编写一些用例.我经常遇到的一个错误是
could not find implicit value for evidence parameter of type org.apache.flink.api.common.typeinfo.TypeInformation[SomeType]
Run Code Online (Sandbox Code Playgroud)
我的问题是,当它们发生时以及它们不发生时我无法确定.
最近的例子如下
...
val largeJoinDataGen = new LargeJoinDataGen(dataSetSize, dataGen, hitRatio)
val see = StreamExecutionEnvironment.getExecutionEnvironment
val newStreamInput = see.addSource(largeJoinDataGen)
...
Run Code Online (Sandbox Code Playgroud)
where 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)
Run Code Online (Sandbox Code Playgroud)
1.为什么给定的例子中有错误?
2.当这些错误发生时以及如何在将来避免它们时,一般指导原则是什么?
PS:第一个scala项目和第一个flink项目所以请耐心等待
dmr*_*het 48
您可以进行导入而不是隐含
import org.apache.flink.streaming.api.scala._
Run Code Online (Sandbox Code Playgroud)
它也会有所帮助.
alj*_*cha 13
这主要发生在您拥有用户代码时,即源或地图函数或具有通用参数的那种性质的东西.在大多数情况下,您可以通过添加类似的东西来修复它
implicit val typeInfo = TypeInformation.of(classOf[(Int, String)])
Run Code Online (Sandbox Code Playgroud)
如果您的代码位于另一个具有泛型参数的方法中,您还可以尝试添加绑定到方法的泛型参数的上下文,如
def myMethod[T: TypeInformation](input: DataStream[Int]): DataStream[T] = ...
Run Code Online (Sandbox Code Playgroud)
Yuv*_*kov 10
我的问题是,当它们发生时以及它们不发生时我无法确定.
它们发生在需要隐式参数时.如果我们看一下方法定义,我们会看到:
def addSource[T: TypeInformation](function: SourceFunction[T]): DataStream[T]
Run Code Online (Sandbox Code Playgroud)
但我们没有看到任何隐式参数定义,它在哪里?
当您看到类型参数属于表单的多态方法时
def foo[T : M](param: T)
Run Code Online (Sandbox Code Playgroud)
Ttype参数在哪里,M是一个上下文绑定.这意味着该方法的创建者正在请求类型的隐式参数M[T].它相当于:
def foo[T](param: T)(implicit ev: M[T])
Run Code Online (Sandbox Code Playgroud)
对于您的方法,它实际上扩展为:
def addSource[T](function: SourceFunction[T])(implicit evidence: TypeInformation[T]): DataStream[T]
Run Code Online (Sandbox Code Playgroud)
这就是你看到编译器抱怨的原因,因为它无法找到方法所需的隐式参数.
如果我们转到Apache Flink Wiki,在Type Information下我们可以看到为什么会发生这种情况:
证据参数误差无隐含值
在
TypeInformation无法创建的情况下,程序无法编译,并显示"无法找到TypeInformation类型的证据参数的隐式值"的错误. 如果生成的代码TypeInformation尚未导入的常见原因.确保导入整个flink.api.scala包.import org.apache.flink.api.scala._
对于通用方法,您还需要它们TypeInformation在调用站点生成a :
对于通用方法,函数参数和返回类型的数据类型对于每个调用可能不相同,并且在定义方法的站点处不知道.上面的代码将导致错误,即没有足够的隐式证据可用.在这种情况下,必须在调用站点生成类型信息并将其传递给方法.Scala为此提供隐式参数.
对于您的类型,这意味着如果调用方法是通用的,它还需要请求为其类型参数绑定的上下文.
| 归档时间: |
|
| 查看次数: |
12646 次 |
| 最近记录: |