Apache flink Flink InvalidTypesException:类型变量的类型';K';在';类别';无法确定

Apache flink Flink InvalidTypesException:类型变量的类型';K';在';类别';无法确定,apache-flink,flink-streaming,Apache Flink,Flink Streaming,Flink 0.10.0最近刚刚发布。我需要从0.9.1迁移一些代码。但出现以下错误: org.apache.flink.api.common.functions.InvalidTypesException:无法确定“class fi.aalto.dmg.frame.FlinkPairWorkloadOperator”中类型变量“K”的类型。这很可能是类型擦除问题。当前,类型提取仅在返回类型中的所有变量都可以从输入类型推断的情况下支持具有泛型变量的类型 代码如下: 公共类FlinkPairWor

Flink 0.10.0最近刚刚发布。我需要从0.9.1迁移一些代码。但出现以下错误:

org.apache.flink.api.common.functions.InvalidTypesException:无法确定“class fi.aalto.dmg.frame.FlinkPairWorkloadOperator”中类型变量“K”的类型。这很可能是类型擦除问题。当前,类型提取仅在返回类型中的所有变量都可以从输入类型推断的情况下支持具有泛型变量的类型

代码如下:

公共类FlinkPairWorkloadOperator实现成对工作负载运算符{
私有数据流;
公共FlinkPairWorkloadOperator(数据流数据流1){
this.dataStream=dataStream1;
}
公共FlinkGroupedWorkloadOperator groupByKey(){
KeyedStream KeyedStream=this.dataStream.keyBy(new KeySelector()){
@凌驾
公共K getKey(Tuple2值)引发异常{
返回值。_1();
}
});
返回新的FlinkGroupedWorkloadOperator(keyedStream);
}
}
为了理解InvalidTypesException是如何发生的,我有另一个例子也抛出了这个异常,我对此一无所知。在本演示中,该程序使用scala.Tuple2,但不使用flink Tuple2

公共类StreamingWordCount{
公共静态void main(字符串[]args)引发异常{
StreamExecutionEnvironment env=StreamExecutionEnvironment.getExecutionEnvironment();
数据流计数=环境
.socketTextStream(“localhost”,9999)
.flatMap(新拆分器());
数据流对=mapToPair(计数,mapToStringIntegerPair);
pairs.print();
环境执行(“套接字流字计数”);
}
公共静态类拆分器实现FlatMapFunction{
@凌驾
公共void flatMap(字符串语句,收集器输出)引发异常{
for(字符串字:句子。拆分(“”){
出。收(字);
}
}
}
公共静态数据流mapToPair(数据流数据流,最终MapPairFunction){
返回dataStream.map(新的MapFunction(){
@凌驾
公共元组2映射(T)引发异常{
返回乐趣。地图对(t);
}
});
}
公共接口MapPairFunction扩展了可序列化{
Tuple2映射对(T);
}
公共静态MapPairFunction mapToStringIntegerPair=新MapPairFunction(){
公共元组2映射对(字符串s){
返回新的Tuple2(s,1);
}
};
}

问题在于,您使用的是
scala.Tuple2
而不是
org.apache.flink.api.java.tuple.Tuple2
,与flink的java api结合使用。Java API的
TypeExtractor
不理解Scala元组。因此,它无法提取类型变量
K
的类型


如果改用
org.apache.flink.api.java.tuple.Tuple2
,则
TypeExtractor
将能够解析类型变量。

能否在此文件中发布
FlinkPairWorkloadOperator
?reduceByKey和groupByKey函数的完整代码。目前我使用Object而不是K。我可以重现您的问题。我会调查的。谢谢你的帮助。如果我使用scala.Tuple2,有没有办法解决这个问题?例如使用ResultTypeQueryable?因为我有一个需要在Spark中实现的高级API,并且它需要scala.Tuple2.Hi,所以我刚刚更新了我的问题。我有一个演示,它可以与scala.Tuple2一起使用,但flink Tuple2也有同样的例外。为什么不直接使用flink的scala API呢?有了它,您可以轻松地处理
scala.Tuples
。即使使用
ResultTypeQueryable
也无法解决Java API中的问题,因为您必须从
GenericTypeInfo[scala.Tuple2]
中获取
TypeInformation[K]
。您必须显式地将
TypeInformation[K]
传递到
FlinkPairWorkloadOperator
。以便进行其他观察。您的第二个程序使用的是
scala.Tuples
,因为您在程序中没有访问元素的地方。因此,不需要找出元组字段类型。它不适用于
org.apache.flink.api.java.tuple.Tuple2
,因为对于这种类型,flink尝试找出元组字段类型,即
K
V
。例外情况是,“无法确定……中类型变量‘K’的类型……类型提取当前仅在返回类型中的所有变量都可以从输入类型推断的情况下支持具有泛型变量的类型”
K
V
都不是输入类型。它们源于Flink无法分析的
MapPairFunction
fun