两个JavaPairRDD中的聚合数据

时间:2015-12-16 18:22:49

标签: java apache-spark

我们在一个JavaPairRDD中有用户及其数据集的数据,如

A,list
A,set
B,map

在其他JavaPairRDD中,我们有数据集及其大小(元素数)。

list,5
set,7
map,1

我想知道用户A有多少元素:A有列表,巫婆由5个元素和集合组成,巫婆由7个元素组成。因此,用户A有12个元素。 结果我们想要下一个

A,12
B,1

但是如何用Java做到这一点。

1 个答案:

答案 0 :(得分:1)

你的第一步应该是找到两个RDD的公共密钥,集合的类型就是它,所以你通过交换然后将它与第二个RDD连接在第一个RDD上获得它。

试试这个:

public class Main {

    public static void main(String[] args) {
        SparkConf sparkConf = new SparkConf(true).setAppName("your_app_name_here").setMaster("local[1]");
        JavaSparkContext sparkContext = new JavaSparkContext(sparkConf);

        Tuple2<String, String>[] array = (Tuple2<String, String>[]) new Tuple2[]{new Tuple2<>("A", "list"), new Tuple2<>("A", "set"), new Tuple2<>("B", "map")};
        JavaPairRDD<String, String> usersWithCollectionType = sparkContext
                .parallelize(Arrays.asList(array))
                .mapToPair(e -> new Tuple2<>(e._1(), e._2()));
        usersWithCollectionType.collect();

        Tuple2<String, Integer>[] array2 = (Tuple2<String, Integer>[]) new Tuple2[]{new Tuple2<>("list", 5), new Tuple2<>("set", 7), new Tuple2<>("map", 1)};
        JavaPairRDD<String, Integer> collectionTypeWithSize = sparkContext
                .parallelize(Arrays.asList(array2))
                .mapToPair(e -> new Tuple2<>(e._1(), e._2()));

        JavaPairRDD<String, Integer> combined = findTotalSizePerUser(usersWithCollectionType, collectionTypeWithSize);

        combined.collect()
                .forEach(System.out::println);
    }

    private static JavaPairRDD<String, Integer> findTotalSizePerUser(JavaPairRDD<String, String> usersWithCollectionType,
                                                                     JavaPairRDD<String, Integer> collectionTypeWithSize) {
        return usersWithCollectionType
                .mapToPair(Tuple2::swap)
                .join(collectionTypeWithSize)
                .mapToPair(p -> new Tuple2<>(p._2()._1(), p._2()._2()))
                .reduceByKey((a, b) -> a + b);
    }
}