konnte nicht finden, impliziten Wert für Beweise parameter vom Typ org.apache.flink.api.common.typeinfo.TypeInformation[...]
Ich bin versucht, zu schreiben einige Anwendungsfälle für Apache Flink. Ein Fehler, ich Laufe ziemlich oft ist
could not find implicit value for evidence parameter of type org.apache.flink.api.common.typeinfo.TypeInformation[SomeType]
Mein problem ist, dass ich kann nicht wirklich festzunageln, wenn Sie geschehen, und wenn Sie dont.
Jüngstes Beispiel dafür wäre die folgende
...
val largeJoinDataGen = new LargeJoinDataGen(dataSetSize, dataGen, hitRatio)
val see = StreamExecutionEnvironment.getExecutionEnvironment
val newStreamInput = see.addSource(largeJoinDataGen)
...
wo LargeJoinDataGen extends GeneratorSource[(Int, String)]
und GeneratorSource[T] extends SourceFunction[T]
, beide definiert in separaten Dateien.
Wenn Sie versuchen, zu bauen, bekomme ich
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. Warum ist es ein Fehler im Beispiel?
2. Was wäre eine Allgemeine Richtlinie, wenn diese Fehler auftreten und wie Sie zu vermeiden in der Zukunft?
P. S.: erste scala-Projekt und erste-flink-Projekt also bitte Geduld
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies geschieht meist, wenn Sie Benutzer-code, d.h. eine Quelle oder eine map-Funktion, oder etwas, dass die Natur, die einen generischen parameter. In den meisten Fällen kann man beheben, indem man so etwas wie
Wenn Ihr code ist in einer anderen Methode, die einen generischen parameter können Sie auch versuchen, indem ein Kontext-gebunden an die generischen parameter der Methode, wie in
TypeInformation.of(classOf[(Int, String)])
, möchten Sie vielleicht, um zu beheben, dass Ihre Antwort ein.Können Sie importieren statt implicits
Wird es auch helfen.
Diese passieren, wenn ein implizite parameter erforderlich ist. Wenn wir uns an der Methode der definition sehen wir:
Aber wir sehen keinen impliziten parameter definiert wird, wo ist es?
Wenn Sie sehen, eine polymorphe Methode, bei der parameter Typ ist von der form
Wo
T
ist der Typ-parameter und dieM
ist ein Kontext-gebunden. Es bedeutet, dass der Schöpfer der Methode ist die Beschaffung einer impliziten parameter vom TypM[T]
. Es ist äquivalent zu:Im Falle Ihrer Methode, es ist eigentlich erweitert:
Dies ist der Grund warum der compiler meckert, als Sie es nicht finden können, den impliziten parameter der Methode ist erforderlich.
Wenn wir gehen, um die Apache Flink Wiki, unter Geben Sie Informationen können wir sehen, warum dies geschieht :
Für generische Methoden, müssen Sie Sie benötigen, um zu generieren, eine
TypeInformation
an der call-site sowie:Für Ihre Typen dies bedeutet, dass, wenn die aufrufende Methode generisch ist, muss Sie auch auf Anfrage den Kontext gebunden für Ihr Typ-parameter.
org.apache.flink.api.scala._
wurde bereits eingeführt und es passiert immer noch. Das ist das, was ich meinte mit "kann nicht festzunageln".GeneratorSource[T]
undSourceFunction[T]
zu haben Kontext-Grenzen sowie:GeneratorSource[T : TypeInformation]
,SourceFunction[T : TypeInformation]