作为输入,我有一个数组,其中元素是一个元组:(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元素的任何想法?
答案 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可以更具可读性。