在同一个RDD上使用Spark zipPartitions

时间:2015-03-13 12:16:52

标签: apache-spark rdd

我是Spark的新手,我在做cartesian这样的事情时遇到了一些问题,但只在同一个分区内。也许一个例子可以清楚地说明我想要做的事情:假设我们有一个用sc.parallelize(1,2,3,4,5,6)制作的RDD,这个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
})

但它不起作用aiterbiter是相同的迭代器...所以我只得到结果的第一行。

有人可以帮助我吗?

感谢。

1 个答案:

答案 0 :(得分:1)

使用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

打印:

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))