解释运算符中的数字前缀是什么意思?

use*_*797 1 apache-spark apache-spark-sql

的以下输出中(1)(6)和是什么意思?Spark版本是2.3.1。(3)explain

在此输入图像描述

Jac*_*ski 5

我认为在 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)