如何在Spark中并行运行重复任务而不是顺序循环?

时间:2017-06-07 18:56:02

标签: apache-spark parallel-processing apache-spark-sql

我刚开始使用Spark,我知道应该避免Spark的非功能性顺序循环方式,以便为我提供最大的性能。

我有一个函数makeData。我需要通过调用此函数n次来创建一个带有此函数返回值的数据帧。目前,我的代码如下所示:

var myNewDF = sqlContext.createDataFrame(sc.emptyRDD[Row],  minority_set.schema)

for ( i <- 1 to n ) {
  myNewDF = myNewDF.unionAll(sqlContext.createDataFrame(sc.parallelize(makeData()),minority_set.schema))
}

有没有办法在每次迭代并行发生的情况下执行此操作? 这里的问题是n可能很大,而且这个循环需要花费很多时间。是否有更多scala / spark友好的方式来实现同样的目标?

1 个答案:

答案 0 :(得分:1)

由于您的所有数据集已经在内存中(通过sc.parallelize(makeData())进行猜测),因此没有点使用Spark SQL的unionAll来执行工会也是本地的(但仍然是分区的!)。

我单独使用Scala,只有在合并了所有记录后,我才能从中构建数据集。

有了这个,我做了如下的事情:

val dataset = (1 to n).par.map { _ => makeData() }.reduce (_ ++ _)
val df = sc.parallelize(dataset, minority_set.schema)