如何合并RDD数组

时间:2017-08-04 02:29:24

标签: scala apache-spark rdd

我有一个RDD数组:registerClass,如何将这些RDD合并到Array[RDD[(String, Double)]]。例如:

RDD[String, Array[Double]]

任何帮助表示赞赏!感谢

3 个答案:

答案 0 :(得分:1)

  1. 您应该将RDDS数组合并为一个RDD(第1行)
  2. 按字符串值(第2行)
  3. 对它们进行分组
  4. 我看到预期的输出已排序,如果需要,您可以对值进行排序(第3行)
  5. 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))