Spark拒绝拉链RDD

时间:2016-03-21 10:31:10

标签: scala apache-spark

我在使用Spark

运行下面代码的最后一行有以下异常

org.apache.spark.SparkException:只能在每个分区中压缩具有相同元素数量的RDD

val rdd1 = anRDD
val rdd2 = AnotherRDD

println(rdd1.count() == rdd2.count()) // Write true
val nparts = rdd1.getNumPartitions + rdd2.getNumPartitions

val rdd1Bis = rdd1.repartition(nparts) // Try to repartition (useless)
val rdd2Bis = rdd2.repartition(nparts)

val zipped = rdd1Bis.zip(rdd2Bis)
println(zipped.count())

有什么问题?

PS:如果我在压缩之前收集rdd1和rdd2但是我需要将它们保存为RDD

2 个答案:

答案 0 :(得分:2)

解决方案可以是使用连接进行压缩:

val rdd1Bis = rdd1.zipWithIndex.map((x) =>(x._2, x._1))
val rdd2Bis = rdd2.zipWithIndex.map((x) =>(x._2, x._1))
val zipped = rdd1Bis.join(rdd2Bis).map(x => x._2)

答案 1 :(得分:0)

它可以检查:请回复它失败的部分

val list1 = List("a","b","c","d")
val list1 = List("a","b","c","d")
val rdd1 = sc.parallelize(list1)
val rdd1 = sc.parallelize(list2)

执行你的代码:

val nparts = rdd1.getNumPartitions + rdd2.getNumPartitions
val rdd1Bis = rdd1.repartition(nparts) // Try to repartition (useless)
val rdd2Bis = rdd2.repartition(nparts)
val zipped = rdd1Bis.zip(rdd2Bis)

结果:

 println(zipped.count())
 4
 zipped.foreach(println)
 (a,a)
 (b,b)
 (c,c)
 (d,d)