java—什么是不推荐使用的向flink输出流提供类型提示的方法?

jtw3ybtb  于 2021-06-25  发布在  Flink
关注(0)|答案(1)|浏览(283)

我遇到了 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() ,但上一次更新是在一年前。

egmofgnx

egmofgnx1#

你的 MyCustomSource 应该实施 ResultTypeQueryable 接口将类型作为 TypeInformation .
看到了吗https://ci.apache.org/projects/flink/flink-docs-release-1.1/apis/common/index.html#type-擦除——类型推断

相关问题