我刚开始使用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友好的方式来实现同样的目标?
答案 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)