我想使用spark的parallelize属性来并行计算多个spark数据帧。
我该怎么做:foreach一个IDList的ID(由100000多个元素组成),我从数据库中查询df(id)并在df上执行算法。
def main(args: Array[String]): Unit = {
val sparkConf = new SparkConf().setAppName("scTest")
val sparkContext = new SparkContext(sparkConf)
val sparkSession = org.apache.spark.sql.SparkSession.builder
.appName("sparkSessionTest")
.getOrCreate
val IDList = List("ID1",...,"ID100000")
IDList.foreach(idString => {
val df = executeQuery(idString,sparkContext)
executeAlgorithm(df, sparkSession)
})
它可以工作,但是此方法在一个ID后面一个ID上执行该过程。
如何并行化流程以提高效率?约束之一是我需要在executeAlgorithm中的executeQuery和sparSession内包含sparkContext,并且它们不可序列化。 我在纱线簇上运行。
先感谢
答案 0 :(得分:0)
如果您只想并行执行作业,则可以使用并行收集器:
IDList.par.foreach
此外,如果要控制一次运行多少个作业的并行性,则可以将自己的tasksupport
分配给从IDList.par
返回的并行列表。并行提交作业后,spark将使用其计划程序在它们之间进行平衡。