CoGrouped RDD上的FlatMap函数

时间:2016-10-14 08:16:50

标签: java apache-spark

我正在尝试在cogroupedRDD上使用flatmap函数,该函数具有签名:

JavaPairRDD<String, Tuple2<Iterable<Row>, Iterable<Row>>>

我的flatmap功能如下:

static FlatMapFunction<Tuple2<String, Tuple2<Iterable<Row>, Iterable<Row>>>,Row> setupF = new FlatMapFunction<Tuple2<String, Tuple2<Iterable<Row>, Iterable<Row>>>,Row>() {
    @Override
    public Iterable<Row> call(Tuple2<String, Tuple2<Iterable<Row>, Iterable<Row>>> row) {
        }};

但我收到编译错误。我确信这一定是一个我无法理解的语法问题。

完整代码:

JavaPairRDD<String, Tuple2<Iterable<Row>, Iterable<Row>>> coGroupedRDD = rdd1.cogroup(rdd2);
JavaRDD<Row> jd = coGroupedRDD.flatmap(setupF);
 static FlatMapFunction<Tuple2<String, Tuple2<Iterable<Row>, Iterable<Row>>>,Row> setupF = new FlatMapFunction<Tuple2<String, Tuple2<Iterable<Row>, Iterable<Row>>>,Row>() {
        @Override
        public Iterable<Row> call(Tuple2<String, Tuple2<Iterable<Row>, Iterable<Row>>> row) {
        //logic
}};

错误:

The method flatmap(FlatMapFunction<Tuple2<String,Tuple2<Iterable<Row>,Iterable<Row>>>,Row>) is undefined for the type JavaPairRDD<String,Tuple2<Iterable<Row>,Iterable<Row>>>

1 个答案:

答案 0 :(得分:2)

这里有一个疯狂的猜测,也许原因是你针对Spark 1.6 API编写代码但实际上你使用Spark 2.0依赖? API在这两个版本之间有所不同。

Spark 1.6 API FlatMapFunction方法签名:

Iterable<R> call(T t)

Spark 2.0 API FlatMapFunction方法签名:

Iterator<R> call(T t) 

因此,请尝试将代码更改为:

new FlatMapFunction<Tuple2<String, Tuple2<Iterable<Row>, Iterable<Row>>>, Row>() {
        @Override
        public Iterator<Row> call(Tuple2<String, Tuple2<Iterable<Row>, Iterable<Row>>> row) {
        //...
        }
};

或使用Java 8 lambda版本:

   coGroupedRDD
   .flatMap(t -> {
        List<Row> result = new ArrayList<>();
        //...use t._1, t._2._1, t._2._2 to construct the result list
        return result.iterator();
    });