我正在尝试在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>>>
答案 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();
});