Search code examples
scalaapache-flinkflink-streaming

could not find implicit value for evidence parameter of type org.apache.flink.api.common.typeinfo.TypeInformation[...]


I am trying to write some use cases for Apache Flink. One error I run into pretty often is

could not find implicit value for evidence parameter of type org.apache.flink.api.common.typeinfo.TypeInformation[SomeType]

My problem is that I cant really nail down when they happen and when they dont.

The most recent example of this would be the following

...
val largeJoinDataGen = new LargeJoinDataGen(dataSetSize, dataGen, hitRatio)
val see = StreamExecutionEnvironment.getExecutionEnvironment
val newStreamInput = see.addSource(largeJoinDataGen)
...

where LargeJoinDataGen extends GeneratorSource[(Int, String)] and GeneratorSource[T] extends SourceFunction[T], both defined in separate files.

When trying to build this I get

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. Why is there an error in the given example?

2. What would be a general guideline when these errors happen and how to avoid them in the future?

P.S.: first scala project and first flink project so please be patient


Solution

  • This mostly happens when you have user code, i.e. a source or a map function or something of that nature that has a generic parameter. In most cases you can fix that by adding something like

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

    If your code is inside another method that has a generic parameter you can also try adding a context bound to the generic parameter of the method, as in

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