use*_*797 1 apache-spark apache-spark-sql
的以下输出中(1),(6)和是什么意思?Spark版本是2.3.1。(3)explain
我认为在 Spark 2.0 左右,Spark SQL 开始为结构化查询的某些部分生成 Java 代码。该功能称为Whole-Stage Java Code Generation(又名Whole-Stage CodeGen)。
Whole-Stage Java 代码生成(又名 Whole-Stage 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)
Run Code Online (Sandbox Code Playgroud)
正如您所注意到的,我有一个包含 3 个星号圆括号数字的查询。这些装饰(星星和数字)都是全阶段 Java 代码生成优化的一部分。
这些数字表示Spark SQL 为其生成单独函数的WholeStageCodegen 子树,这些子树共同构成 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:
...
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
424 次 |
| 最近记录: |