Spark SQL:为什么我在 Spark UI 中看到 3 个作业而不是一个作业?

Rem*_*oon 5 apache-spark apache-spark-sql spark-ui

根据我的理解,actionSpark 中每个人都有一份工作。
但我经常看到单个操作触发了多个作业。我试图通过对数据集进行简单的聚合来测试这一点,以获得每个类别的最大值(这里是“主题”字段)

在检查 Spark UI 时,我可以看到为该groupBy操作执行了 3 个“作业” ,而我预期只有一个。
谁能帮我理解为什么有 3 而不是只有 1?

   students.show(5)

    +----------+--------------+----------+----+-------+-----+-----+
    |student_id|exam_center_id|   subject|year|quarter|score|grade|
    +----------+--------------+----------+----+-------+-----+-----+
    |         1|             1|      Math|2005|      1|   41|    D|
    |         1|             1|   Spanish|2005|      1|   51|    C|
    |         1|             1|    German|2005|      1|   39|    D|
    |         1|             1|   Physics|2005|      1|   35|    D|
    |         1|             1|   Biology|2005|      1|   53|    C|
    |         1|             1|Philosophy|2005|      1|   73|    B|
    

  // Task : Find Highest Score in each subject
  val highestScores = students.groupBy("subject").max("score")
  highestScores.show(10)

+----------+----------+
|   subject|max(score)|
+----------+----------+
|   Spanish|        98|
|Modern Art|        98|
|    French|        98|
|   Physics|        98|
| Geography|        98|
|   History|        98|
|   English|        98|
|  Classics|        98|
|      Math|        98|
|Philosophy|        98|
+----------+----------+
only showing top 10 rows
Run Code Online (Sandbox Code Playgroud)

在检查 Spark UI 时,我可以看到为该groupBy操作执行了 3 个“作业” ,而我预期只有一个。 在此处输入图片说明

在此处输入图片说明 谁能帮我理解为什么有 3 而不是只有 1?

== Physical Plan ==
*(2) HashAggregate(keys=[subject#12], functions=[max(score#15)])
+- Exchange hashpartitioning(subject#12, 1)
   +- *(1) HashAggregate(keys=[subject#12], functions=[partial_max(score#15)])
      +- *(1) FileScan csv [subject#12,score#15] Batched: false, Format: CSV, Location: InMemoryFileIndex[file:/C:/lab/SparkLab/files/exams/students.csv], PartitionFilters: [], PushedFilters: [], ReadSchema: struct<subject:string,score:int>
Run Code Online (Sandbox Code Playgroud)

maz*_*cha 2

我认为只有 #3 执行实际的“工作”(执行一个计划,如果您在 SQL 选项卡上打开查询的“详细信息”,您将看到该计划)。另外两个是准备步骤——

  • #1 正在查询 NameNode 来构建InMemoryFileIndex以读取您的 csv,并且
  • #2 正在对要执行的数据集进行采样,.groupBy("subject").max("score")这在内部需要sortByKey这里有更多详细信息)。