Scala spark中的rdd.collect().map,编译需要时间
我正在处理一个任务,在这个任务中,我使用多个数据帧并应用与另一个数据帧的连接 组合结果被映射,我使用的是Scala spark中的rdd.collect().map,编译需要时间,scala,apache-spark,apache-spark-sql,bigdata,Scala,Apache Spark,Apache Spark Sql,Bigdata,我正在处理一个任务,在这个任务中,我使用多个数据帧并应用与另一个数据帧的连接 组合结果被映射,我使用的是pNodeArray.rdd.collect().map(f=>{ pNodeArray是我使用另一个数据帧创建的数据帧 df.groupBy("P_XX_M", "G_RM_XX_D", "B_CD_XD") .agg(collect_list(struct("col1","col2"......) var pmap = pNodeArray.rdd.collect().map(f=>
pNodeArray.rdd.collect().map(f=>{
pNodeArray
是我使用另一个数据帧创建的数据帧
df.groupBy("P_XX_M", "G_RM_XX_D", "B_CD_XD")
.agg(collect_list(struct("col1","col2"......)
var pmap = pNodeArray.rdd.collect().map(f=>{
var P_ISD = if (f.getAs[Any]("P_ISD") != null) f.getAs("P_ISD").toString() else null
}).toList.groupBy(_._1).mapValues(_.map(_._2))
有没有简单的方法来解决这个问题,或者有不同的方法或建议来减少时间
例如:对于任务,我只使用一个ID,底层数据库有数百万条或更多记录。
对于一个ID,完成collect()需要35分钟。映射需要更多时间
如果可以,请取消
collect()
,或者至少尝试限制发送回驱动程序的数据量,以明显提高处理速度。您能给我们一些测试数据和所需的输出供我们处理吗?collect()将所有节点的数据提取到驱动程序节点。因此,它始终需要确定输出的要求并明智地使用它。为了知道是否所有执行器都在某个阶段使用,最好检查Spark History Server的executors选项卡中有多少执行器正在运行任务。我给出了如下配置,-executor memory 10g—驱动程序内存32g—num executors 20—executor核5,4个活动任务正在运行