我有一个RDD数组:registerClass
,如何将这些RDD合并到Array[RDD[(String, Double)]]
。例如:
RDD[String, Array[Double]]
任何帮助表示赞赏!感谢
答案 0 :(得分:1)
val mergeIntoOne: RDD[(String, Double)] = array.fold(sparkSession.sparkContext.emptyRDD[(String, Double)])(_ ++ _)
val groupByKeys: RDD[(String, Iterable[Double])] = mergeIntoOne.groupByKey()
val sortedValues = groupByKeys.mapValues(_.toList.sorted)
答案 1 :(得分:0)
假设您在每个RDD中没有重复的密钥,那么您可以在Array[RDD]
上使用fullOuterJoin
在所有rdds上尝试foldLeft:
val rdd1 = sc.parallelize(Seq(("x", 1.0), ("y", 2.0)))
val rdd2 = sc.parallelize(Seq(("x", 3.0), ("y", 4.0)))
val rdd3 = sc.parallelize(Seq(("x", 5.0), ("y", 6.0)))
val rdds = Array(rdd1, rdd2, rdd3)
val startRdd = sc.parallelize(Seq[(String, Seq[Option[Double]])]())
(rdds.foldLeft(startRdd)(
(rdd1, rdd2) => rdd1.fullOuterJoin(rdd2).mapValues(
p => p._1.getOrElse(Seq[Option[Double]]()) :+ p._2
)
).mapValues(_.collect{ case Some(x) => x }).collect)
// res15: Array[(String, Seq[Double])] = Array((x,List(1.0, 3.0, 5.0)), (y,List(2.0, 4.0, 6.0)))
答案 2 :(得分:-1)
它取决于你想要使用它的位置,但你可以使用for循环并联合数组
scala> var a = Array(("a1",1.1))
a: Array[(String, Double)] = Array((a1,1.1))
scala> var b = Array(("a2",1.2))
b: Array[(String, Double)] = Array((a2,1.2))
scala> for (i <- 0 to b.length) {
| a = a:+b(i)}
scala> a
res2: Array[(String, Double)] = Array((a1,1.1), (a2,1.2))