web-dev-qa-db-ja.com

タイプorg.Apache.flink.api.common.typeinfo.TypeInformation [...]の証拠パラメーターの暗黙的な値が見つかりませんでした

Apache Flinkのユースケースをいくつか作成しようとしています。私がよく遭遇するエラーの1つは

_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。これらのエラーが発生した場合の一般的なガイドラインは何ですか?また、今後それらを回避する方法は?

追伸:最初のscalaプロジェクトと最初のflinkプロジェクトです。しばらくお待ちください

19
jheyd

これは主に、ユーザーコード、つまりソースまたはマップ関数、または一般的なパラメーターを持つその性質のものがある場合に発生します。ほとんどの場合、次のようなものを追加することで修正できます

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

コードがジェネリックパラメーターを持つ別のメソッド内にある場合は、次のように、メソッドのジェネリックパラメーターにバインドされたコンテキストを追加することもできます。

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

暗黙の代わりにインポートを行うことができます

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

それも役立ちます。

44
dmreshet

私の問題は、それらが起こったときとしないときを本当に特定できないことです。

implicit parameter が必要な場合に発生します。メソッド定義を見ると、次のことがわかります。

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

しかし、暗黙のパラメーターが定義されていることはありません。どこにありますか?

型パラメーターが次の形式である多相メソッドを見るとき

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]

メソッドが必要とする暗黙のパラメーターを見つけることができないため、コンパイラーが文句を言うのはこのためです。

Type Information の下にあるApache Flink Wikiにアクセスすると、これが発生する理由がわかります。

エビデンスパラメータエラーの暗黙的な値はありません

TypeInformationを作成できなかった場合、プログラムはコンパイルに失敗し、「TypeInformation型の証拠パラメーターの暗黙的な値が見つかりませんでした」というエラーが表示されます。A TypeInformationを生成するコードがインポートされていない場合によくある理由。 flink.api.scalaパッケージ全体を必ずインポートしてください。 import org.Apache.flink.api.scala ._

ジェネリックメソッドの場合、呼び出しサイトでTypeInformationも生成するように要求する必要があります。

ジェネリックメソッドの場合、関数パラメーターのデータ型と戻り値の型は、すべての呼び出しで同じではない場合があり、メソッドが定義されているサイトでは不明です。上記のコードは、十分な暗黙の証拠が利用できないというエラーになります。そのような場合、タイプ情報は呼び出しサイトで生成され、メソッドに渡される必要があります。 Scalaはそのための暗黙的なパラメーターを提供します。

タイプの場合、これは、呼び出しメソッドがジェネリックである場合、そのタイプパラメーターにバインドされたコンテキストも要求する必要があることを意味します。

10
Yuval Itzchakov