Spark innerals: преимущества проекта - PullRequest
1 голос
/ 30 января 2020

Я прочитал этот вопрос , в котором ОП пытался преобразовать этот логический план:

Aggregate [sum(inc(vals#4L)) AS sum(inc(vals))#7L]
+- LocalRelation [vals#4L]

В это:

Aggregate [sum(inc_val#6L) AS sum(inc(vals))#7L]
+- Project [inc(vals#4L) AS inc_val#6L]
   +- LocalRelation [vals#4L]

У меня есть пара вопросов:

  1. Зачем ему нужен оператор проекта? В чем его преимущество?
  2. Насколько я знаю, Project - это оператор, представляющий инструкцию SELECT, так как, возможно, план не включает оператора Project?

1 Ответ

3 голосов
/ 03 февраля 2020

Помещение : агрегация включает в себя два этапа:

  1. Расчет частичного агрегата

  2. с последующим перемешиванием и глобальный агрегат.

В основном Агрегат представляет собой двухэтапную операцию.

  1. Why did he want to have the Project operator? What is the advantage of it?
    Я могу вспомнить два сценария ios:
    Codegen enabled : При включенном code-gen код для всего этапа (включая код UDF) запускается в пределах одного итератора. Это может привести к проблемам с памятью, когда UDF интенсивно использует процессор / память и т.д. c. Обратите внимание, что агрегация происходит внутри одного итератора.
    Codegen отключен : При отключенном code-gen каждый оператор будет работать в своем собственном итераторе. Возможность получения высокого значения OOM / CPU уменьшается, поскольку мы отсоединили агрегацию от запуска UDF.
  2. As far as I know, Project is the operator that represents the SELECT statement, so how could possibly a plan not include a Project operator?
    Пока последний оператор возвращает необходимые столбцы, нам не нужен явный проект. Например, скажем, самый верхний оператор (скажем, фильтр) возвращает 3 столбца. Если требуется, чтобы в качестве вывода нам потребовалось 3 столбца, явный проект не требуется. Если нам требуется только 2 из 3, нам нужен явный проект. Правило оптимизатора делает это как часть планирования запросов. https://github.com/apache/spark/blob/master/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/optimizer/Optimizer.scala#L440
...