Flink InvalidTypesException:无法确定'class'中TypeVariable'K'的类型

时间:2015-11-19 21:22:04

标签: apache-flink flink-streaming

Flink 0.10.0最近刚刚发布。我有一些代码需要从0.9.1迁移。但是得到了以下错误:

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

以下是代码:

 public class FlinkPairWorkloadOperator<K,V> implements PairWorkloadOperator<K,V> {

    private DataStream<Tuple2<K, V>> dataStream;

    public FlinkPairWorkloadOperator(DataStream<Tuple2<K, V>> dataStream1) {
        this.dataStream = dataStream1;
    }



    public FlinkGroupedWorkloadOperator<K, V> groupByKey() {
        KeyedStream<Tuple2<K, V>, K> keyedStream = this.dataStream.keyBy(new KeySelector<Tuple2<K, V>, K>() {
            @Override
            public K getKey(Tuple2<K, V> value) throws Exception {
                return value._1();
            }
        });
        return new FlinkGroupedWorkloadOperator<>(keyedStream);
    }
}

为了理解InvalidTypesException是如何发生的,我还有另一个例子,它也抛出了这个异常,我不知道它。在这个演示中,该程序适用于scala.Tuple2,但不能使用Tuple2。

public class StreamingWordCount {
    public static void main(String[] args) throws Exception {
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

        DataStream<String> counts = env
            .socketTextStream("localhost", 9999)
            .flatMap(new Splitter());

        DataStream<Tuple2<String, Integer>> pairs = mapToPair(counts, mapToStringIntegerPair);
        pairs.print();
        env.execute("Socket Stream WordCount");
    }

    public static class Splitter implements FlatMapFunction<String, String> {
        @Override
        public void flatMap(String sentence, Collector<String> out) throws Exception {
            for (String word: sentence.split(" ")) {
                out.collect(word);
            }
        }
    }

    public static  <K,V,T> DataStream<Tuple2<K,V>> mapToPair(DataStream<T> dataStream , final MapPairFunction<T, K, V> fun){
        return dataStream.map(new MapFunction<T, Tuple2<K, V>>() {
            @Override
            public Tuple2<K, V> map(T t) throws Exception {
                return fun.mapPair(t);
            }
        });
    }

   public interface MapPairFunction<T, K, V> extends Serializable {
     Tuple2<K,V> mapPair(T t);
  }

  public static MapPairFunction<String, String, Integer> mapToStringIntegerPair = new MapPairFunction<String, String, Integer>() {
       public Tuple2<String, Integer> mapPair(String s) {
            return new Tuple2<String, Integer>(s, 1);
        }
    };
}

1 个答案:

答案 0 :(得分: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将能够解析类型变量。