如何在给定的 rdd 上应用 flatMapToPair?

how to apply flatMapToPair on a given rdd?

我有一个名为 rddAJavaPairRDD<String, List<Tuple2<Integer, Integer>>>。例如(收集rddA后):[(word1,[(187,267), (224,311), (187,110)]), (word2,[(187,200), (10,90)])]。因此,例如,word1 是键,值是 [(187,267), (224,311), (187,110)])].

如何定义相应的 JavaPairRDD<Integer, List<Integer>> 以获得以下输出:

[(187, [267, 110, 200]), (224,[311]), (10,[90])]

所以,得到的JavaPairRDD包括三个key:187, 22410。例如,键 187 具有 [267, 110, 200] 作为列表值。

您只需要展平元组列表(元组的第二个值)并按元组的第一个元素分组。

JavaPairRDD<Integer, List<Integer>> result = rddA
                .flatMapValues(x -> x) // flattening the list
                .mapToPair(x -> x._2) // getting rid of the first key
                .groupByKey()
                .mapValues(x -> { // turning the iterable into a list
                    List<Integer> list = new ArrayList<>();
                    x.forEach(list::add);
                    return list;
                });