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

时间:2018-11-20 19:47:08

标签: apache-spark apache-spark-sql

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

enter image description here

1 个答案:

答案 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:
...