Scala 如何合并RDD阵列

Scala 如何合并RDD阵列,scala,apache-spark,rdd,Scala,Apache Spark,Rdd,我有一个RDD数组:array[RDD[(String,Double)],如何将这些RDD合并到RDD[String,array[Double]。例如: RDD Array: [[('x', 1), ('y', 2)], [('x', 3), ('y', 4)],...] => RDD: [('x', [1, 3,...]), ('y', [2, 4, ...])] 感谢您的帮助!谢谢假设每个RDD中没有重复的密钥,那么您可以在所有RDD上使用fullOuterJoin在阵列[RDD]上

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

RDD Array: [[('x', 1), ('y', 2)], [('x', 3), ('y', 4)],...] =>
RDD: [('x', [1, 3,...]), ('y', [2, 4, ...])]

感谢您的帮助!谢谢

假设每个RDD中没有重复的密钥,那么您可以在所有RDD上使用
fullOuterJoin
阵列[RDD]
上尝试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)))

假设每个RDD中没有重复的密钥,则可以在所有RDD上使用
fullOuterJoin
Array[RDD]
上尝试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)))
  • 您应该将RDD数组合并为一个RDD(第1行)
  • 按字符串值对它们进行分组(第2行)
  • 我看到预期输出已排序,如果需要,您可以对值进行排序(第3行)
  • val mergeintone:RDD[(String,Double)]=array.fold(sparkSession.sparkContext.emptyRDD[(String,Double)])(u++)
    val groupByKey:RDD[(字符串,Iterable[Double])]=mergeintone.groupByKey()
    val sortedValues=groupByKeys.mapValues(u.toList.sorted)
    

  • 您应该将RDD数组合并为一个RDD(第1行)
  • 按字符串值对它们进行分组(第2行)
  • 我看到预期输出已排序,如果需要,您可以对值进行排序(第3行)
  • val mergeintone:RDD[(String,Double)]=array.fold(sparkSession.sparkContext.emptyRDD[(String,Double)])(u++)
    val groupByKey:RDD[(字符串,Iterable[Double])]=mergeintone.groupByKey()
    val sortedValues=groupByKeys.mapValues(u.toList.sorted)
    

    这取决于您想在哪里使用它,但您可以使用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))
    
    scala>var a=Array((“a1”,1.1))
    a:数组[(字符串,双精度)]=数组((a1,1.1))
    scala>VarB=数组((“a2”,1.2))
    数组[(字符串,双精度)]=数组((a2,1.2))
    scala>用于(i)a
    res2:Array[(字符串,双精度)]=数组((a1,1.1)、(a2,1.2))
    
    这取决于您想在何处使用它,但您可以使用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))
    
    scala>var a=Array((“a1”,1.1))
    a:数组[(字符串,双精度)]=数组((a1,1.1))
    scala>VarB=数组((“a2”,1.2))
    数组[(字符串,双精度)]=数组((a2,1.2))
    scala>用于(i)a
    res2:Array[(字符串,双精度)]=数组((a1,1.1)、(a2,1.2))
    
    非常感谢!确实不支持嵌套RDD。现在的问题是:数组[RDD(String,Double)],如何将RDD数组合并到RDD(String,Array[Double])?您能用您试图解决的实际问题更新您的问题吗?非常感谢!确实不支持嵌套RDD。现在的问题实际上是:数组[RDD(String,Double)],如何将RDD数组合并到RDD(String,Array[Double])?你能用你试图解决的实际问题更新你的问题吗?你是如何得到RDD数组的?我想应该是RDD数组的,请确认。你是如何得到RDD数组的?我想应该是RDD数组的,请确认。我在这里没有看到任何RDD。你注意到他问了一个关于Apache Spark的问题吗?我没有看到他看到的任何RDDre.你注意到他问了一个关于Apache Spark的问题吗?谢谢!分组(第2行)后,
    groupByKeys
    数组中元素的顺序会与原始数组顺序相同吗?还是在折叠过程中乱序?我想排序是唯一可以确定的方法。顺序可能会有所不同,因为分组(第2行)后,SparkThanks重新分区od数据,在
    groupByKeys
    数组中元素的顺序会与原始数组顺序相同吗?还是在折叠过程中被洗牌?我想排序是唯一可以确定的方法。顺序可能会有所不同,因为Spark正在重新分区od数据