我遇到了 InvalidTypesException
在flink中,通常在自定义泛型 SourceFunction<OUT>
. 下面是一个示例,当添加到我的streamexecutionenvironment时,它在运行时抛出以下异常:
public class MyCustomSource<OUT> extends RichSourceFunction<OUT> {
@Override
public void run(SourceContext<OUT> sourceContext) throws Exception {
OUT foo = null;
// ... creates foo somehow ...
sourceContext.collect(foo);
}
@Override
public void cancel() {
// ...
}
}
相关例外文本为:
原因:org.apache.flink.api.common.functions.invalidtypesexception:无法确定“class org.apache.flink.streaming.api.functions.source.richsourcefunction”中typevariable“out”的类型。这很可能是类型擦除问题。类型提取当前仅在返回类型中的所有变量都可以从输入类型中推导出来的情况下支持具有泛型变量的类型。
这种情况是否会发生 OUT
是pojo、泛型类型、类似tuple的flink内部类型等。
我找到了一个可靠的方法来避免这种情况,通过 returns()
方法。例如:
final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.addSource(new MyCustomSource<String>())
.returns(String.class)
//.etc.
但是这个方法在flink1.1.4中被弃用了;有人知道什么是不推荐的方式来提供类型提示吗?flink的维基只提到 returns()
,但上一次更新是在一年前。
1条答案
按热度按时间egmofgnx1#
你的
MyCustomSource
应该实施ResultTypeQueryable
接口将类型作为TypeInformation
.看到了吗https://ci.apache.org/projects/flink/flink-docs-release-1.1/apis/common/index.html#type-擦除——类型推断