答案 0 :(得分:3)
当Spark SQL开始为结构化查询的某些部分生成Java代码时,我认为它是在Spark 2.0左右。该功能称为 Whole-Stage Java代码生成(又称 Whole-Stage CodeGen )。
整个阶段的Java代码生成(又称“整个阶段的代码生成”)是Spark SQL中的一种物理查询优化,它将多个物理运算符(作为支持代码生成的计划的子树)融合在一起成为一个Java函数。
您可以使用explain
运算符来了解结构化查询中Java生成的代码部分。
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)
您注意到,我有一个带有3个加括号的加括号的数字的查询。这些装饰(星号和数字)都是整个阶段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:
...