我在local[N]
(使用N< = #available cores)模式下使用spark 1.6在一个仅包含1个分区的数据帧上对UDF进行一些昂贵的计算(即从Hive中读取)表)。像这样:
val data = sc.parallelize(0 to 1000,1).toDF("ID") // the source data (from Hive table) with 1 partition
val expensiveCalc = udf((i:Int) => {Thread.sleep(100);i}) // expensive dummy UDF
val computed = data.withColumn("dummy",expensiveCalc($"ID")) // apply udf
computed.collect() // trigger action
如果我运行我的代码,只有1个核心正在运行(因为只创建了1个任务)。我可以通过将我的数据帧重新划分为(至少)N个分区来实现完全并行,这样在应用我的UDF之前至少使用data.repartition(N)
创建N个任务。
有没有办法在不改变分区数量的情况下在上面的代码中实现并行性?