我正在学习Spark在Databricks内部的工作方式。我了解改组是如何导致工作阶段的,但我不了解是什么原因导致了工作。我以为这种关系是每个动作一项工作,但是有时候每个动作发生很多工作。
例如
val initialDF = spark
.read
.parquet("/mnt/training/wikipedia/pagecounts/staging_parquet_en_only_clean/")
val someDF = initialDF
.orderBy($"project")
someDF.show
触发两项工作,一项是查看架构,另一项是执行.show
。
并使用与.groupBy
相同的代码
val initialDF = spark
.read
.parquet("/mnt/training/wikipedia/pagecounts/staging_parquet_en_only_clean/")
val someDF = initialDF
.groupBy($"project").sum()
someDF.show
...触发9个工作。
用.show
代替.count
,.groupBy
版本触发两个作业,而.orderBy
版本触发三个作业。
对不起,我无法共享数据以使其具有可重复性,但我希望了解抽象创建作业的规则。如果有帮助,很高兴分享.explain
的结果。
答案 0 :(得分:1)
show
(不带参数)显示结果的前20行。
在数据集上触发show
时,它会转换为head(20)
动作,而该动作又会转换为limit(20)
动作。
show
-> head
-> limit
关于limit
Spark以增量方式执行limit
,直到满足限制查询为止。
首次尝试从一个分区中检索所需的行数。
如果不满足限制要求,则在第二次尝试中,它将尝试从4个分区(由spark.sql.limit.scaleUpFactor
确定,默认为4)中检索所需的行数。然后处理16个分区,依此类推,直到满足限制或数据耗尽为止。
在每次尝试中,都会产生一个单独的作业。
答案 1 :(得分:0)
通常您声明为1:1。也就是说, 1个操作会导致具有1..N个阶段的 1个作业,每个阶段有M个任务,并且可以跳过多个阶段。
但是,某些操作会在“水下”触发额外的作业。例如。 数据点:如果仅传递列作为参数,而不传递数据点的值,则Spark必须先获取所有不同的值,以生成列,然后执行收集,即额外的工作。
显示也是生成额外作业的一种特殊情况。