Я думаю, что именно в Spark 2.0 Spark SQL начал генерировать код Java для некоторых частей структурированных запросов.Эта функция называется Генерация Java-кода для всего этапа (он же CodeGen для всего этапа ).
Генерация Java-кода для всего этапа (или CodeGen для всей стадии)просто оптимизация физического запроса в Spark SQL, которая объединяет несколько физических операторов (как поддерево планов, поддерживающих генерацию кода) в единую функцию Java.
Вы можете узнать о том, что сгенерированные Java части кода структурированногозапрос с использованием оператора explain
.
val q = spark.range(5)
.groupBy('id % 2 as "g")
.agg(collect_list('id) as "ids")
.join(spark.range(5))
.where('id === 'g)
scala> q.explain
== Physical Plan ==
*(3) BroadcastHashJoin [g#1266L], [id#1272L], Inner, BuildRight
:- *(3) Filter isnotnull(g#1266L)
: +- ObjectHashAggregate(keys=[(id#1264L % 2)#1278L], functions=[collect_list(id#1264L, 0, 0)])
: +- Exchange hashpartitioning((id#1264L % 2)#1278L, 200)
: +- ObjectHashAggregate(keys=[(id#1264L % 2) AS (id#1264L % 2)#1278L], functions=[partial_collect_list(id#1264L, 0, 0)])
: +- *(1) Range (0, 5, step=1, splits=8)
+- BroadcastExchange HashedRelationBroadcastMode(List(input[0, bigint, false]))
+- *(2) Range (0, 5, step=1, splits=8)
Как вы заметили, у меня есть запрос с тремя звездочками в круглых скобках.Все эти украшения (звезда и цифры) являются частью полной оптимизации генерации Java-кода.
Числа обозначают поддеревья WholeStageCodegen , для которых Spark SQL генерирует отдельные функции, которые все вместе являютсябазовый код, который Spark SQL использует для выполнения запроса.
Вы можете увидеть код и поддеревья, используя debug
неявный интерфейс.
scala> q.queryExecution.debug.codegen
Found 3 WholeStageCodegen subtrees.
== Subtree 1 / 3 ==
*(1) Range (0, 5, step=1, splits=8)
Generated code:
...