是否并行化了Spark阵列上运行的Scala函数?

时间:2014-05-21 14:03:42

标签: scala apache-spark

要再次映射函数RDD的所有元素,首先需要使用collect方法将RDD转换为Array类型:

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

在上面的示例&#34; x&#34;中是否对数组类型进行了所有操作并行运行?

2 个答案:

答案 0 :(得分:4)

  

要再次映射函数RDD的所有元素,首先需要使用collect方法将RDD转换为Array类型

不,不是。 RDD有map方法。

  

以上示例“x”中Array类型的所有操作是否并行运行?

上例中的Array类型没有任何操作。 x仍然是一个RDD,你扔掉x.collect()创建的数组。如果您改为呼叫x.collect().map(...)x.collect().flatMap(...),则操作不会并行运行。

一般来说,Spark不会以任何方式影响对数组或Scala集合的操作;只有RDD上的操作才能并行运行。当然,您可以使用例如Scala并行集合用于并行化单个节点内的计算,但这与Spark无关。

答案 1 :(得分:0)

在spark独立应用程序(不是REPL)中,您必须更改操作顺序。

首先致电flatMap,然后致电collect

According to spark documentationflatMap是一个转换,Spark中的所有转换都是惰性的,因为它们不会立即计算结果。操作被推迟到collect之类的操作方法调用。 在调用collect spark并行化所有操作w.r.t flatMap之后。