要再次映射函数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;中是否对数组类型进行了所有操作并行运行?
答案 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 documentation,flatMap
是一个转换,Spark中的所有转换都是惰性的,因为它们不会立即计算结果。操作被推迟到collect
之类的操作方法调用。
在调用collect
spark并行化所有操作w.r.t flatMap
之后。