Spark:将RDD拆分成对吗?

时间:2015-10-24 17:19:58

标签: scala apache-spark

作为输入,我有一个数组,其中元素是一个元组:(tag, elements)其中tag是一个整数,elements是一个整数列表。我需要展开这些数据,以便得到一个集合,其中每个输入元素成为一个元组:(tag, el1),(tag, el2),...(tag, elN)。举例说明:

import org.apache.spark.SparkConf
import org.apache.spark.SparkContext
import org.apache.spark.SparkContext._
import org.apache.log4j.Logger
import org.apache.log4j.Level

object Unfold {


  val data = Array( 
    (1,List(2,3,5)),
    (11,List(21,31,51)),
    (111, List(211,311,511))
  )

  val shoudGet = List (
    (1,2), (1,3), (1,5),
    (11,21), (11,31), (11,51),
    (111,211), (111,311), (111,511)
  )
  def main(args: Array[String]) {
    Logger.getLogger("org.apache.spark").setLevel(Level.WARN)
    Logger.getLogger("org.eclipse.jetty.server").setLevel(Level.OFF)
    // set up environment
    val conf = new SparkConf()
      .setMaster("local[5]")
      .setAppName("Simple")
      .set("spark.executor.memory", "2g")
    val sc = new SparkContext(conf)

    val rdd = sc.parallelize(data)
    val result = data.map{case (tag,list) => (tag, ???)}
  }
}

有关如何展开RDD元素的任何想法?

2 个答案:

答案 0 :(得分:1)

这样的事情应该有效:

val result = data.flatMap({ case (tag, list) => list.map(x => (tag, x)) })

或者在某些情况下这可能会更快一点:

val result = data.flatMap({ case (tag, list) => list.view.map(x => (tag, x)) })

答案 1 :(得分:0)

另一种方法:

val result = for {
 (tag, list) <- data
 x <- list
} yield (tag, x)

这只不过是map和flatMap的语法糖,但在某些情况下,for-comprehension可以更具可读性。