Scala - 如何获得两个RDDS的相同部分?

时间:2018-02-01 04:27:06

标签: scala join rdd

有两个RDD:

val rdd1 = sc.parallelize(List(("aaa", 1), ("bbb", 4), ("ccc", 3)))
val rdd2 = sc.parallelize(List(("aaa", 2),  ("bbb", 5), ("ddd", 2))) 

如果我想通过第一个字段加入这些字段并得到如下结果:

List(("aaa", 1,2), ("bbb",4 ,5))

我应该编码什么?Thx !!!!

2 个答案:

答案 0 :(得分:0)

您可以join RDD并map将结果发送到有用的数据结构:

val resultRDD = rdd1.join(rdd2).map{
  case (k: String, (v1: Int, v2: Int)) => (k, v1, v2)
}
// resultRDD: org.apache.spark.rdd.RDD[(String, Int, Int)] = MapPartitionsRDD[53] at map at <console>:32

resultRDD.collect
// res1: Array[(String, Int, Int)] = Array((aaa,1,2), (bbb,4,5))

答案 1 :(得分:0)

作为RDDs类型的RDD[(String, Int)],您只需使用join加入这两个RDDs即可获得RDD[(String, (Int, Int))]。现在您需要List[(String, (Int, Int))],您需要收集已加入的RDD (如果加入RDD,则不建议使用)并将其转换为List。请尝试以下代码,

val rdd1: RDD[(String, Int)] = sc.parallelize(List(("aaa", 1), ("bbb", 4), ("ccc", 3)))
val rdd2: RDD[(String, Int)] = sc.parallelize(List(("aaa", 2), ("bbb", 5), ("ddd", 2)))

//simply join two RDDs
val joinedRdd: RDD[(String, (Int, Int))] = rdd1.join(rdd2)

//only if you want List then collect it (It is not recommended for huge RDDs)
val lst: List[(String, (Int, Int))] = joinedRdd.collect().toList

println(lst)

//output
//List((bbb,(4,5)), (aaa,(1,2)))