PySpark中调用一次show() Action为何生成两个Job?
Spark Job 常见疑问解析
测试数据(CSV)
empid,empname,empsal,empdept,empblock 1,abc,2000,cse,A 2,def,1000,ece,C 3,ghi,8000,eee,D 4,jkl,4000,ece,B 5,mno,3000,itd,F 6,pqr,6000,mec,C
执行现象
- 执行以下CSV读取代码时,尽管这不是Action操作,但Spark UI中仍会生成一个Job,目的是确定列名:
df1=spark.read.format("csv").option("header",True).load('csv_file_location') - 执行以下转换操作时,不会生成任何Job(Spark转换为懒加载模式,仅记录逻辑执行计划):
x=df1.groupBy("empblock").agg(avg("empsal").alias("avgsal")).filter(col("avgsal")>2000).orderBy("empblock") - 执行
x.show()这个Action时,会生成两个Job,和“一次Action对应一个Job”的常规认知不符。
问题解答
为什么一次Action会生成多个Job?
核心原因是**orderBy全局排序操作触发了额外Job**。
Spark的全局排序需要先对数据做全局洗牌,为保证排序正确性,会拆分两步执行:第一个Job完成聚合、过滤逻辑,生成中间结果并收集数据分布的统计信息;第二个Job基于这些统计信息完成全局排序,最终将结果返回给show()。这两步对应两个独立的Job。
Job数量是否不依赖Action的调用次数?
是的,Job数量不完全由Action调用次数决定。
Spark的Job生成逻辑取决于完成Action所需的独立计算阶段数。除了全局排序,像动态分区插入时的分区发现、部分复杂多阶段转换组合,都可能让单个Action触发多个Job。本质上,Job数量由计算所需的独立执行阶段决定,而非Action的调用次数。
内容的提问来源于stack exchange,提问作者Cassius Clay
相关产品推荐
相关产品推荐

