有两个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 !!!!
答案 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)))