Flink flatMap 使用lambda表示式異常問題

元亨利貞發表於2023-11-28

程式碼示例:

.flatMap((FlatMapFunction<String, JSONObject>) (message, out) -> {
        String mes = message.replaceAll("\\\\", "");
        if (StringUtils.isNotEmpty(mes)) {
            out.collect(JSON.parseObject(mes));
        }
}).name("主流格式化")

錯誤資訊:

Caused by: org.apache.flink.api.common.functions.InvalidTypesException: The generic type parameters of 'Collector' are missing. In many cases lambda methods don't provide enough information for automatic type extraction when Java generics are involved. An easy workaround is to use an (anonymous) class instead that implements the 'org.apache.flink.api.common.functions.FlatMapFunction' interface. Otherwise the type has to be specified explicitly using type information.
	at org.apache.flink.api.java.typeutils.TypeExtractionUtils.validateLambdaType(TypeExtractionUtils.java:371)
	at org.apache.flink.api.java.typeutils.TypeExtractionUtils.extractTypeFromLambda(TypeExtractionUtils.java:188)
	at org.apache.flink.api.java.typeutils.TypeExtractor.getUnaryOperatorReturnType(TypeExtractor.java:557)
	at org.apache.flink.api.java.typeutils.TypeExtractor.getFlatMapReturnTypes(TypeExtractor.java:174)
	at org.apache.flink.streaming.api.datastream.DataStream.flatMap(DataStream.java:612)
	at com.vsoc.realtime.schedule.check.EmulationRealCheckJob.main(EmulationRealCheckJob.java:127)

解決方案:

.flatMap((FlatMapFunction<String, JSONObject>) (message, out) -> {
        String mes = message.replaceAll("\\\\", "");
        if (StringUtils.isNotEmpty(mes)) {
            out.collect(JSON.parseObject(mes));
        }
}).name("主流數式化")
.returns(new TypeHint<JSONObject>() {
})

錯誤原因:

這個錯誤是由於Flink在處理使用Java泛型的lambda表示式時,無法自動提取足夠的型別資訊。一個簡單的解決方法是使用一個實現了org.apache.flink.api.common.functions.FlatMapFunction介面的(匿名)類,而不是lambda表示式。否則,型別必須使用型別資訊明確指定





來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70024433/viewspace-2997754/,如需轉載,請註明出處,否則將追究法律責任。

相關文章