我们在一个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做到这一点。
答案 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);
}
}