Apache spark 在同一RDD上创建分区

Apache spark 在同一RDD上创建分区,apache-spark,rdd,Apache Spark,Rdd,我是Spark的新手,在做类似于笛卡尔(cartesian)的事情时遇到了一些问题,但只能在同一个分区内进行。也许有一个例子可以清楚地说明我想做的事情:假设我们有一个RDD,使用sc.parallelize(1,2,3,4,5,6),这个RDD被划分为三个分区,分别包含:(1,2)(3,4)(5,6)。然后我想得到以下结果:((1,1)、(1,2)、(2,1)、(2,2))((3,3)、(3,4)、(4,3)、(4,4))((5,5)、(5,6)、(6,5)、(6,6)) 到目前为止,我尝试的是

我是Spark的新手,在做类似于笛卡尔(cartesian)的事情时遇到了一些问题,但只能在同一个分区内进行。也许有一个例子可以清楚地说明我想做的事情:假设我们有一个RDD,使用
sc.parallelize(1,2,3,4,5,6)
,这个RDD被划分为三个分区,分别包含:
(1,2)
<代码>(3,4)<代码>(5,6)。然后我想得到以下结果:
((1,1)、(1,2)、(2,1)、(2,2))
<代码>((3,3)、(3,4)、(4,3)、(4,4))<代码>((5,5)、(5,6)、(6,5)、(6,6))

到目前为止,我尝试的是:

 partitionedData.zipPartitions(partitionedData)((aiter, biter) => {
  var res = new ListBuffer[(Double,Double)]()
  while(aiter.hasNext){
    val a = aiter.next()
    while(biter.hasNext){
      val b = biter.next()
      res+=(a,b)
    }
  }
  res.iterator
})
但是它不起作用,因为
aiter
biter
是同一个迭代器……所以我只得到结果的第一行

有人能帮我吗


谢谢。

使用
RDD.mapPartitions

val rdd = sc.parallelize(1 to 6, 3)
val res = rdd.mapPartitions { iter =>
  val seq = iter.toSeq
  val res = for (a <- seq; b <- seq) yield (a, b)
  res.iterator
}
res.collect

谢谢你的回复,我是Scala的新手。什么是seq?我的意思是,它在内存使用方面表现如何?谢谢。
Seq
是一种“特质”(一种界面),所以你永远无法确定:)。它看起来像是迭代器。toSeq创建了一个
,它就像一个惰性链表。Scala喜欢链表。如果您担心内存使用,可以尝试
toArray
而不是
toSeq
res0: Array[(Int, Int)] = Array((1,1), (1,2), (2,1), (2,2), (3,3), (3,4), (4,3), (4,4), (5,5), (5,6), (6,5), (6,6))