Это несколько разочаровывает. Но сначала вы должны увидеть это с точки зрения действий. Я не буду рассматривать кеширование.
Если вы сделаете следующее, то наверняка произойдет оптимизация.
val df1 = df0.withColumn(...
val df2 = df1.withColumn(...
В вашем примере для работы необходимо действие типа count. Но эти два утверждения слишком разнообразны, поэтому пропущенная обработка не очевидна. Таким образом, мы не делимся.
В общем, Действие = Работа - это правильный взгляд на это. Для DFs Catalyst Optimizer может начать работу, даже если вы этого не понимаете. Для RRD (устаревших) это немного отличалось.
Это также не оптимизируется:
import org.apache.spark.sql.functions._
val df = spark.range(1,10000).toDF("c1")
val df_intermediate = df.withColumn("c2", col("c1") + 100)
val x = df_intermediate.agg(max("c2"))
val y = df_intermediate.agg(min("c2"))
val z = x.union(y).count
x и y оба go возвращаются к источнику. Можно было бы подумать, что это будет легче сделать, и это также 1 действие здесь. Нужно сделать .explain, но идея состоит в том, чтобы оставить его Spark из-за ленивых вычислений и т. Д. c.
В качестве отступления: Эффективно ли кэшировать фрейм данных для одного действия? Spark-приложение, в котором на этот фрейм данных ссылаются несколько раз? & В каких ситуациях пропускаются этапы DAG?