解决 Flink 中 'org.apache.flink.api.common.functions.InvalidTypesException: The types of the interface org.apache.flink.util.OutputTag could not be inferred' 错误

在使用 Apache Flink 时,你可能会遇到 'org.apache.flink.api.common.functions.InvalidTypesException: The types of the interface org.apache.flink.util.OutputTag could not be inferred' 的错误。这个错误信息表明 Flink 无法推断出 org.apache.flink.util.OutputTag 接口的具体类型。

错误原因:

这个错误通常是由于 Flink 对以下几种类型的支持有限造成的:

  • 合成接口: 由编译器生成的接口,例如在使用 lambda 表达式时。* Lambda 表达式: Java 8 中引入的匿名函数。* 泛型或原始类型: 未指定具体类型的类型参数。

解决方法:

为了解决这个问题,你可以尝试以下几种方法:

  1. 明确指定 OutputTag 的类型:

    java OutputTag<String> myOutputTag = new OutputTag<String>('my-output-tag');

    在创建 OutputTag 实例时,明确地指定其类型参数,例如 <String>

  2. 使用具体类代替接口:

    如果可能,尽量使用具体的类来代替接口,避免使用 OutputTag

  3. 避免使用 Lambda 表达式:

    尝试使用匿名内部类来代替 lambda 表达式。

  4. 检查 Flink 版本:

    较新版本的 Flink 可能对这些类型的支持更完善,尝试升级到最新版本。

示例:

假设你正在使用 ProcessFunction 并遇到了这个错误,可以尝试以下修改:java// 错误示范DataStream input = ...;OutputTag outputTag = new OutputTag('side-output');

SingleOutputStreamOperator mainStream = input.process(new MyProcessFunction(outputTag));

// 正确示范DataStream input = ...;OutputTag outputTag = new OutputTag<>('side-output'); // 明确指定类型

SingleOutputStreamOperator mainStream = input.process(new MyProcessFunction(outputTag));

通过明确指定 OutputTag 的类型参数,可以帮助 Flink 正确推断类型,避免该错误的发生。


原文地址: https://www.cveoy.top/t/topic/fWOD 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录