Flink-CEP中缺少'Map'的泛型类型参数

时间:2017-08-13 18:41:19

标签: maven apache-flink eclipse-jdt flink-streaming flink-cep

Flink-CEP中检测模式的代码如下所示

// Generate temperature warnings for each matched warning pattern

DataStream<TemperatureEvent> warnings = tempPatternStream.select(
    (Map<String, MonitoringEvent> pattern) -> {
        TemperatureEvent first = (TemperatureEvent) pattern.get("first");


        return new TemperatureEvent(first.getRackID(), first.getTemperature()) ;
    }
);

如果在Mac中使用命令+ F9进行构建,则会显示以下错误

Exception in thread "main" org.apache.flink.api.common.functions.InvalidTypesException: The generic type parameters of 'Map' are missing. 
It seems that your compiler has not stored them into the .class file. 
Currently, only the Eclipse JDT compiler preserves the type information necessary to use the lambdas feature type-safely. 
See the documentation for more information about how to compile jobs containing lambda expressions.
    at org.apache.flink.api.java.typeutils.TypeExtractor.validateLambdaGenericParameter(TypeExtractor.java:1316)
    at org.apache.flink.api.java.typeutils.TypeExtractor.validateLambdaGenericParameters(TypeExtractor.java:1302)
    at org.apache.flink.api.java.typeutils.TypeExtractor.getUnaryOperatorReturnType(TypeExtractor.java:346)
    at org.apache.flink.cep.PatternStream.select(PatternStream.java:64)
    at org.stsffap.cep.monitoring.CEPMonitoring.main(CEPMonitoring.java:85

然而,构建usign mvn clean install然后通过Control + R运行会显示输出

  • 我想知道为什么会一直这样?

  • 有什么办法吗?

PS:但是我使用的是eclipse JDT插件,即使它在日志中显示错误。 POM.XML的内容是

<plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <compilerId>jdt</compilerId>
                </configuration>
                <dependencies>
                    <dependency>
                        <groupId>org.eclipse.tycho</groupId>
                        <artifactId>tycho-compiler-jdt</artifactId>
                        <version>0.21.0</version>
                    </dependency>
                </dependencies>
            </plugin>

建议最受欢迎。谢谢提前

2 个答案:

答案 0 :(得分:2)

我知道Java 8 Lambdas非常方便。但是,它们几乎不通过反射提供类型信息,这就是Flink在生成底层序列化器时遇到问题的原因。为了在IDE中运行Flink程序,我建议在涉及泛型类型时使用Java匿名类而不是lambdas。

答案 1 :(得分:0)

首先,检查一下jdk版本1.8?并将tycho-compiler-jdt的版本升级为1.0.0以下插件:

<plugin>
    <!-- Use compiler plugin with tycho as the adapter to the JDT compiler. -->
    <artifactId>maven-compiler-plugin</artifactId>
    <configuration>
        <source>1.8</source>
        <target>1.8</target>
        <compilerId>jdt</compilerId>
    </configuration>
    <dependencies>
        <!-- This dependency provides the implementation of compiler "jdt": -->
        <dependency>
            <groupId>org.eclipse.tycho</groupId>
            <artifactId>tycho-compiler-jdt</artifactId>
            <version>1.0.0</version>
        </dependency>
    </dependencies>
</plugin>

您可以参考来源:https://ci.apache.org/projects/flink/flink-docs-release-1.4/dev/java8.html

之后你要做的就是使用maven在cli上构建项目。一旦程序通过maven构建,您也可以在IntelliJ中运行它。