要将函数映射到 RDD 的所有元素,需要首先使用收集方法将 RDD 转换为数组类型:
scala> val x = sc.parallelize(List(List("a"), List("b"), List("c", "d")))
x: org.apache.spark.rdd.RDD[List[String]] = ParallelCollectionRDD[1] at parallelize at <console>:12
scala> x.collect()
res0: Array[List[String]] = Array(List(a), List(b), List(c, d))
scala> x.flatMap(y => y)
res3: org.apache.spark.rdd.RDD[String] = FlatMappedRDD[3] at flatMap at <console>:15
上面示例“x”中数组类型的所有操作都是并行运行的吗?
最佳答案
To map a function agains all elements of an RDD it is required to first convert the RDD to an Array type using collect method
不,不是。 RDD 有 map
方法。
Are all operations on the Array type in above example "x" run in parallel ?
上面的例子中没有对Array类型进行任何操作。 x
仍然是一个 RDD,你扔掉 x.collect()
创建的数组。如果您改为调用 x.collect().map(...)
或 x.collect().flatMap(...)
,则操作不会在并行。
一般来说,Spark 不会以任何方式影响数组或 Scala 集合上的操作;只有 RDD 上的操作才会并行运行。当然,您可以使用例如Scala 并行集合用于在单个节点内并行计算,但这与 Spark 无关。
关于scala - 在 Spark 数组上运行的 Scala 函数是并行的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23785553/