Исключает ли искра промежуточный результат, если к этому промежуточному результату применяются два разных преобразования? - PullRequest
0 голосов
/ 22 апреля 2020

Предположим, мы начинаем с некоторых данных и получаем промежуточный результат df_intermediate. Вдоль конвейера от исходных данных до df_intermediate все преобразования ленивы и фактически ничего не вычисляется.

Тогда я бы хотел выполнить два разных преобразования в df_intermediate. Например, я хотел бы рассчитать df_intermediate.agg({"col":"max"}) и df_intermediate.approxquantile("col", [0.1,0.2,0.3], 0.01), используя две отдельные команды.

Интересно, в следующем сценарии нужно ли пересчитать spark 1011 при выполнении второго преобразования? Другими словами, выполняет ли Spark вычисление для двух вышеупомянутых преобразований, начиная с необработанных данных без сохранения промежуточного результата? Очевидно, что я могу кэшировать промежуточный результат, но мне просто интересно, если Spark внутренне выполняет такую ​​оптимизацию.

1 Ответ

1 голос
/ 23 апреля 2020

Это несколько разочаровывает. Но сначала вы должны увидеть это с точки зрения действий. Я не буду рассматривать кеширование.

Если вы сделаете следующее, то наверняка произойдет оптимизация.

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?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...