我有一个类型为JavaPairRDD<Integer, Iterable<Tuple3<Integer, String, Double>>> 的rdd,怎么通过结构转换,在不缺少数据的情况下,将结构转变为JavaPairRDD<Tuple2<Double, String>, Tuple2<Integer, Integer>> 类型
时间: 2023-12-07 17:03:17 浏览: 66
可以通过以下代码实现:
```java
JavaPairRDD<Tuple2<Double, String>, Tuple2<Integer, Integer>> resultRdd = rdd.flatMapToPair(
new PairFlatMapFunction<Tuple2<Integer, Iterable<Tuple3<Integer, String, Double>>>, Tuple2<Double, String>, Tuple2<Integer, Integer>>() {
@Override
public Iterator<Tuple2<Tuple2<Double, String>, Tuple2<Integer, Integer>>> call(Tuple2<Integer, Iterable<Tuple3<Integer, String, Double>>> input) throws Exception {
List<Tuple2<Tuple2<Double, String>, Tuple2<Integer, Integer>>> result = new ArrayList<>();
for (Tuple3<Integer, String, Double> tuple : input._2()) {
Tuple2<Tuple2<Double, String>, Tuple2<Integer, Integer>> newTuple = new Tuple2<>(
new Tuple2<>(tuple._3(), tuple._2()),
new Tuple2<>(input._1(), tuple._1())
);
result.add(newTuple);
}
return result.iterator();
}
}
);
```
首先使用 `flatMapToPair` 对每个元素进行迭代,将原来的 `JavaPairRDD<Integer, Iterable<Tuple3<Integer, String, Double>>>` 转换为 `JavaPairRDD<Tuple2<Double, String>, Tuple2<Integer, Integer>>`。
在迭代过程中,我们先遍历 `Iterable`,对于每个 `Tuple3<Integer, String, Double>`,创建一个新的 `Tuple2<Tuple2<Double, String>, Tuple2<Integer, Integer>>` 对象,并将原来的数据填入其中。最后将所有新生成的元素放入一个 `List` 中返回,最终返回这个 `List` 的迭代器。
最终得到的 `resultRdd` 就是转换后的结果。
阅读全文