2014-05-21 53 views
2

要映射函数agains它需要首先使用collect方法的RDD转换为数组类型的RDD的所有元素:在Spark Array上并行运行的Scala函数?

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”运行平行 ?

+0

'x.collect()'返回一个Scala集合,但由于您没有将它分配给一个变量,它会被抛弃。 'x.flatMap(y => y)'将一个转换应用于'x'并返回一个新的RDD,但由于Spark中的转换是惰性的,因此这不会触发任何活动。针对RDD *的转换和操作*是并行运行的,但是如果您对'x.collect()'(普通数组)的输出执行'map()',则不会并行运行。 –

回答

4

要映射函数agains它正在使用collect方法需要首先将RDD转换为数组类型的RDD的所有元素

不,事实并非如此。 RDD有map方法。

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

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

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

0

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

第一次打电话flatMap然后collect

According to spark documentation,flatMap是一种转换,Spark中的所有转换都是懒惰的,因为它们不会马上计算它们的结果。该操作被延迟直至拨打诸如collect之类的操作方法。 致电collect火花并行后,所有操作w.r.t flatMap